feea347f7ff0456859afd8ac70e40990.png

Ruby 语法

让我们编写一个简单的 Ruby 程序。所有的 Ruby 文件扩展名都是 .rb。所以,把下面的源代码放在 test.rb 文件中。

#!/usr/bin/ruby -w

puts "Hello, Ruby!";

在这里,假设您的 /usr/bin 目录下已经有可用的 Ruby 解释器。现在,尝试运行这个程序,如下所示:

$ ruby test.rb

这将会产生下面的结果:

Hello, Ruby!

您已经看到了一个简单的 Ruby 程序,现在让我们看看一些 Ruby 语法相关的基本概念:

Ruby 程序中的空白

在 Ruby 代码中的空白字符,如空格和制表符一般会被忽略,除非当它们出现在字符串中时才不会被忽略。然而,有时候它们用于解释模棱两可的语句。当启用 -w 选项时,这种解释会产生警告。

实例:

a + b 被解释为 a+b (这是一个局部变量)
a  +b 被解释为 a(+b) (这是一个方法调用)

Ruby 程序中的行尾

Ruby 把分号和换行符解释为语句的结尾。但是,如果 Ruby 在行尾遇到运算符,比如 +、- 或反斜杠,它们表示一个语句的延续。

Ruby 标识符

标识符是变量、常量和方法的名称。Ruby 标识符是大小写敏感的。这意味着 Ram 和 RAM 在 Ruby 中是两个不同的标识符。

Ruby 标识符的名称可以包含字母、数字和下划线字符( _ )。

保留字

下表列出了 Ruby 中的保留字。这些保留字不能作为常量或变量的名称。但是,它们可以作为方法名。

模块定义:module
类定义:class
方法定义:def ,undef
检查类型:defined?
条件语句:if ,then ,else ,elsif ,case ,when ,unless
循环语句:for ,in ,while ,until ,next,break ,do ,redo ,retry ,yield
逻辑判断:not ,and ,or
逻辑值和空值:true ,false ,nil
异常处理:rescue ,ensure
对象引用:super ,self
块的起始:begin/end
嵌入模块:BEGIN ,END
文件相关:FILELINE
方法返回:return
别名:alias

Ruby 中的 Here Document

"Here Document" 是指建立多行字符串。在 << 之后,您可以指定一个字符串或标识符来终止字符串,且当前行之后直到终止符为止的所有行是字符串的值。

如果终止符用引号括起,引号的类型决定了面向行的字符串类型。请注意<< 和终止符之间必须没有空格。

下面是不同的实例:

#!/usr/bin/ruby -w

print <<EOF
    This is the first way of creating
    here document ie. multiple line string.
EOF

print <<"EOF";                # 与上面相同
    This is the second way of creating
    here document ie. multiple line string.
EOF

print <<`EOC`                 # 执行命令
    echo hi there
    echo lo there
EOC

print <<"foo", <<"bar"          # 您可以把它们进行堆叠
    I said foo.
foo
    I said bar.
bar

这将产生以下结果:

This is the first way of creating
    her document ie. multiple line string.
    This is the second way of creating
    her document ie. multiple line string.
hi there
lo there
        I said foo.
        I said bar.

Ruby BEGIN 语句

语法

BEGIN {
   code
}

声明 code 会在程序运行之前被调用。

实例

#!/usr/bin/ruby

puts "This is main Ruby Program"

BEGIN {
   puts "Initializing Ruby Program"
}

这将产生以下结果:

Initializing Ruby Program
This is main Ruby Program

Ruby END 语句

语法

END {
   code
}

声明 code 会在程序的结尾被调用。

实例

#!/usr/bin/ruby

puts "This is main Ruby Program"

END {
   puts "Terminating Ruby Program"
}
BEGIN {
   puts "Initializing Ruby Program"
}

这将产生以下结果:

Initializing Ruby Program
This is main Ruby Program
Terminating Ruby Program

Ruby 注释

注释会对 Ruby 解释器隐藏一行,或者一行的一部分,或者若干行。您可以在行首使用字符( # ):

# 我是注释,请忽略我。

或者,注释可以跟着语句或表达式的同一行的后面:

name = "Madisetti" # 这也是注释

您可以注释多行,如下所示:

# 这是注释。
# 这也是注释。
# 这也是注释。
# 这还是注释。

下面是另一种形式。这种块注释会对解释器隐藏 =begin/=end 之间的行:

=begin
这是注释。
这也是注释。
这也是注释。
这还是注释。
=end

Ruby 数据类型

本章节我们将为大家介绍 Ruby 的基本数据类型。

Ruby支持的数据类型包括基本的Number、String、Ranges、Symbols,以及true、false和nil这几个特殊值,同时还有两种重要的数据结构——Array和Hash。

数值类型(Number)

1、整型(Integer)

整型分两种,如果在31位以内(四字节),那为Fixnum实例。如果超过,即为Bignum实例。

整数范围从 -230 到 230-1 或 -262 到 262-1。在这个范围内的整数是类 Fixnum 的对象,在这个范围外的整数存储在类 Bignum 的对象中。

您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字。下划线字符在数字字符串中被忽略。

您可以获取一个 ASCII 字符或一个用问号标记的转义序列的整数值。

实例

123                  # Fixnum 十进制
1_234                # Fixnum 带有下划线的十进制
-500                 # 负的 Fixnum
0377                 # 八进制
0xff                 # 十六进制
0b1011               # 二进制
?a                   # 'a' 的字符编码
?n                  # 换行符(0x0a)的编码
12345678901234567890 # Bignum
#整型 Integer 以下是一些整型字面量
#字面量(literal):代码中能见到的值,数值,bool值,字符串等都叫字面量
#如以下的0,1_000_000,0xa等
a1=0

#带千分符的整型
a2=1_000_000

#其它进制的表示
a3=0xa
puts a1,a2
puts a3

#puts print 都是向控制台打印字符,其中puts带回车换行符
=begin
这是注释,称作:嵌入式文档注释
类似C#中的/**/
=end

浮点型

Ruby 支持浮点数。它们是带有小数的数字。浮点数是类 Float 的对象,且可以是下列中任意一个。

实例

123.4                # 浮点值
1.0e6                # 科学记数法
4E20                 # 不是必需的
4e+20                # 指数前的符号
#浮点型
f1=0.0
f2=2.1
f3=1000000.1
puts f3

算术操作

加减乘除操作符:+-/;指数操作符为*

指数不必是整数,例如

#指数算术
puts 2**(1/4)#1与4的商为0,然后2的0次方为1
puts 16**(1/4.0)#1与4.0的商为0.25(四分之一),然后开四次方根

字符串类型

Ruby 字符串简单地说是一个 8 位字节序列,它们是类 String 的对象。

双引号标记的字符串允许替换和使用反斜线符号,单引号标记的字符串不允许替换,且只允许使用 和 ' 两个反斜线符号。

实例

#!/usr/bin/ruby -w

puts 'escape using ""';
puts 'That's right';

这将产生以下结果:

escape using ""
That's right

您可以使用序列 #{ expr } 替换任意 Ruby 表达式的值为一个字符串。在这里,expr 可以是任意的 Ruby 表达式。

#!/usr/bin/ruby -w

puts "Multiplication Value : #{24*60*60}";

这将产生以下结果:

Multiplication Value : 86400
#!/usr/bin/ruby -w

name="Ruby"
puts name
puts "#{name+",ok"}"

输出结果为:

Ruby
Ruby,ok

反斜线符号

下表列出了 Ruby 支持的反斜线符号:

dc257b9d6367a1d5985bc3fa0aef6eb9.png

如需了解更多有关 Ruby 字符串的细节,请查看 Ruby 字符串(String)。

数组

数组字面量通过[]中以逗号分隔定义,且支持range定义。

  • (1)数组通过[]索引访问
  • (2)通过赋值操作插入、删除、替换元素
  • (3)通过+,-号进行合并和删除元素,且集合做为新集合出现
  • (4)通过<<号向原数据追加元素
  • (5)通过*号重复数组元素
  • (6)通过|和&符号做并集和交集操作(注意顺序)

实例:

#!/usr/bin/ruby

ary = [  "fred", 10, 3.14, "This is a string", "last element", ]
ary.each do |i|
   puts i
end

这将产生以下结果:

fred
10
3.14
This is a string
last element

如需了解更多有关 Ruby 数组的细节,请查看 Ruby 数组(Array)。

哈希类型

Ruby 哈希是在大括号内放置一系列键/值对,键和值之间使用逗号和序列 => 分隔。尾部的逗号会被忽略。

实例

#!/usr/bin/ruby

hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
   print key, " is ", value, "n"
end

这将产生以下结果:

green is 240
red is 3840
blue is 15

如需了解更多有关 Ruby 哈希的细节,请查看 Ruby 哈希(Hash)。

范围类型

一个范围表示一个区间。

范围是通过设置一个开始值和一个结束值来表示。范围可使用 s..e 和 s...e 来构造,或者通过 Range.new 来构造。

使用 .. 构造的范围从开始值运行到结束值(包含结束值)。使用 ... 构造的范围从开始值运行到结束值(不包含结束值)。当作为一个迭代器使用时,范围会返回序列中的每个值。

范围 (1..5) 意味着它包含值 1, 2, 3, 4, 5,范围 (1...5) 意味着它包含值 1, 2, 3, 4 。

实例

#!/usr/bin/ruby

(10..15).each do |n|
   print n, ' '
end

这将产生以下结果:

10 11 12 13 14 15

如需了解更多有关 Ruby 范围的细节,请查看 Ruby 范围(Range)。

Ruby 类和对象

Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括:

  • 数据封装
  • 数据抽象
  • 多态性
  • 继承

这些特性将在 面向对象的 Ruby 中进行讨论。

一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您的自行车是自行车类的一个实例。

以车辆为例,它包括车轮(wheels)、马力(horsepower)、燃油或燃气罐容量(fuel or gas tank capacity)。这些属性形成了车辆(Vehicle)类的数据成员。借助这些属性您能把一个车辆从其他车辆中区分出来。

车辆也能包含特定的函数,比如暂停(halting)、驾驶(driving)、超速(speeding)。这些函数形成了车辆(Vehicle)类的数据成员。因此,您可以定义类为属性和函数的组合。

类 Vehicle 的定义如下:

Class Vehicle
{
   Number no_of_wheels
   Number horsepower
   Characters type_of_tank
   Number Capacity
   Function speeding
   {
   }
   Function driving
   {
   }
   Function halting
   {
   }
}

通过给这些数据成员分配不同的值,您可以创建类 Vehicle 的不同实例。例如,一架飞机有三个轮子,马力 1,000,燃油罐容量为 100 升。以同样的方式,一辆汽车有四个轮子,马力 200,煤气罐容量为 25 升。

在 Ruby 中定义类

为了使用 Ruby 实现面向对象编程,您需要先学习如何在 Ruby 中创建对象和类。

在 Ruby 中,类总是以关键字 class 开始,后跟类的名称。类名的首字母应该大写。类 Customer 如下所示:

class Customer
end

您可以使用关键字 end 终止一个类。 中的所有数据成员都是介于类定义和 end 关键字之间。

Ruby 类中的变量

Ruby 提供了四种类型的变量:

  • 局部变量:局部变量是在方法中定义的变量。局部变量在方法外是不可用的。在后续的章节中,您将看到有关方法的更多细节。局部变量以小写字母或 _ 开始。
  • 实例变量:实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。
  • 类变量:类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
  • 全局变量:类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。

实例

使用类变量 @@no_of_customers,您可以判断被创建的对象数量,这样可以确定客户数量。

class Customer
   @@no_of_customers=0
end

在 Ruby 中使用 new 方法创建对象

对象是类的实例。现在您将学习如何在 Ruby 中创建类的对象。在 Ruby 中,您可以使用类的方法 new 创建对象。

方法 new 是一种独特的方法,在 Ruby 库中预定义。new 方法属于方法。

下面的实例创建了类 Customer 的两个对象 cust1 和 cust2:

cust1 = Customer. new
cust2 = Customer. new

在这里,cust1 和 cust2 是两个对象的名称。对象名称后跟着等号(=),等号后跟着类名,然后是点运算符和关键字 new

自定义方法来创建 Ruby 对象

您可以给方法 new 传递参数,这些参数可用于初始化类变量。

当您想要声明带参数的 new 方法时,您需要在创建类的同时声明方法 initialize

initialize 方法是一种特殊类型的方法,将在调用带参数的类的 new 方法时执行。

下面的实例创建了 initialize 方法:

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
end

在本实例中,您可以声明带有 id、name、addr 作为局部变量的 initialize方法。在这里,defend 用于定义 Ruby 方法 initialize。在后续的章节中,您将学习有关方法的更多细节。

initialize 方法中,把这些局部变量的值传给实例变量 @cust_id、@cust_name 和 @cust_addr。在这里,局部变量的值是随着 new 方法进行传递的。

现在,您可以创建对象,如下所示:

cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

Ruby 类中的成员函数

在 Ruby 中,函数被称为方法。中的每个方法是以关键字 def 开始,后跟方法名。

方法名总是以小写字母开头。在 Ruby 中,您可以使用关键字 end 来结束一个方法。

下面的实例定义了一个 Ruby 方法:

class Sample
   def function
      statement 1
      statement 2
   end
end

在这里,statement 1statement 2 是类 Sample 内的方法 function 的主体的组成部分。这些语句可以是任何有效的 Ruby 语句。例如,我们可以使用方法 puts 来输出 Hello Ruby,如下所示:

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

下面的实例将创建类 Sample 的一个对象,并调用 hello 方法:

#!/usr/bin/ruby

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

# 使用上面的类来创建对象
object = Sample. new
object.hello

这将会产生下面的结果:

Hello Ruby!

Ruby 类案例

下面将创建一个名为 Customer 的 Ruby 类,您将声明两个方法:

  • display_details:该方法用于显示客户的详细信息。
  • total_no_of_customers:该方法用于显示在系统中创建的客户总数量。
#!/usr/bin/ruby

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
    def total_no_of_customers()
       @@no_of_customers += 1
       puts "Total number of customers: #@@no_of_customers"
    end
end

display_details 方法包含了三个 puts 语句,显示了客户 ID、客户名字和客户地址。其中,puts 语句:

puts "Customer id #@cust_id"

将在一个单行上显示文本 Customer id,后跟变量 @cust_id 的值。

当您想要在一个单行上显示实例变量的文本和值时,您需要在 puts 语句的变量名前面放置符号(#)。文本和带有符号(#)的实例变量应使用双引号标记。

第二个方法,totalno_of_customers,包含了类变量 @@no_of_customers。表达式 @@no_ofcustomers+=1 在每次调用方法 total_no_of_customers 时,把变量 no_of_customers 加 1。通过这种方式,您将得到类变量中的客户总数量。

现在创建两个客户,如下所示:

cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

在这里,我们创建了 Customer 类的两个对象,cust1 和 cust2,并向 new 方法传递必要的参数。当 initialize 方法被调用时,对象的必要属性被初始化。

一旦对象被创建,您需要使用两个对象来调用类的方法。如果您想要调用方法或任何数据成员,您可以编写代码,如下所示:

cust1.display_details()
cust1.total_no_of_customers()

对象名称后总是跟着一个点号,接着是方法名称或数据成员。我们已经看到如何使用 cust1 对象调用两个方法。使用 cust2 对象,您也可以调用两个方法,如下所示:

cust2.display_details()
cust2.total_no_of_customers()

保存并执行代码

现在,把所有的源代码放在 main.rb 文件中,如下所示:

#!/usr/bin/ruby

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
   end
   def total_no_of_customers()
      @@no_of_customers += 1
      puts "Total number of customers: #@@no_of_customers"
   end
end

# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# 调用方法
cust1.display_details()
cust1.total_no_of_customers()
cust2.display_details()
cust2.total_no_of_customers()

接着,运行程序,如下所示:

$ ruby main.rb

这将产生以下结果:

Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Total number of customers: 1
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala
Total number of customers: 2

Ruby 变量

变量是持有可被任何程序使用的任何数据的存储位置。

Ruby 支持五种类型的变量。您已经在前面的章节中大概了解了这些变量,本章节将为您详细讲解这五种类型的变量。

Ruby 全局变量

全局变量以 $ 开头。未初始化的全局变量的值为 nil,在使用 -w 选项后,会产生警告。

给全局变量赋值会改变全局状态,所以不建议使用全局变量。

下面的实例显示了全局变量的用法。

#!/usr/bin/ruby

$global_variable = 10
class Class1
  def print_global
     puts "Global variable in Class1 is #$global_variable"
  end
end
class Class2
  def print_global
     puts "Global variable in Class2 is #$global_variable"
  end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

在这里,$global_variable 是全局变量。这将产生以下结果:

注意:在 Ruby 中,您可以通过在变量或常量前面放置 # 字符,来访问任何变量或常量的值。

Global variable in Class1 is 10
Global variable in Class2 is 10

Ruby 实例变量

实例变量以 @ 开头。未初始化的实例变量的值为 nil,在使用 -w 选项后,会产生警告。

下面的实例显示了实例变量的用法。

#!/usr/bin/ruby

class Customer
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
end

# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# 调用方法
cust1.display_details()
cust2.display_details()

在这里,@cust_id、@cust_name 和 @cust_addr 是实例变量。这将产生以下结果:

Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala

Ruby 类变量

类变量以 @@ 开头,且必须初始化后才能在方法定义中使用。

引用一个未初始化的类变量会产生错误。类变量在定义它的类或模块的子类或子模块中可共享使用。

在使用 -w 选项后,重载类变量会产生警告。

下面的实例显示了类变量的用法。

#!/usr/bin/ruby

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
    def total_no_of_customers()
       @@no_of_customers += 1
       puts "Total number of customers: #@@no_of_customers"
    end
end

# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# 调用方法
cust1.total_no_of_customers()
cust2.total_no_of_customers()

在这里,@@no_of_customers 是类变量。这将产生以下结果:

Total number of customers: 1
Total number of customers: 2

Ruby 局部变量

局部变量以小写字母或下划线 _ 开头。局部变量的作用域从 class、module、def 或 do 到相对应的结尾或者从左大括号到右大括号 {}。

当调用一个未初始化的局部变量时,它被解释为调用一个不带参数的方法。

对未初始化的局部变量赋值也可以当作是变量声明。变量会一直存在,直到当前域结束为止。局部变量的生命周期在 Ruby 解析程序时确定。

在上面的实例中,局部变量是 id、name 和 addr。

Ruby 常量

常量以大写字母开头。定义在类或模块内的常量可以从类或模块的内部访问,定义在类或模块外的常量可以被全局访问。

常量不能定义在方法内。引用一个未初始化的常量会产生错误。对已经初始化的常量赋值会产生警告。

#!/usr/bin/ruby

class Example
   VAR1 = 100
   VAR2 = 200
   def show
       puts "Value of first Constant is #{VAR1}"
       puts "Value of second Constant is #{VAR2}"
   end
end

# 创建对象
object=Example.new()
object.show

在这里,VAR1 和 VAR2 是常量。这将产生以下结果:

Value of first Constant is 100
Value of second Constant is 200

Ruby 伪变量

它们是特殊的变量,有着局部变量的外观,但行为却像常量。您不能给这些变量赋任何值。

  • self: 当前方法的接收器对象。
  • true: 代表 true 的值。
  • false: 代表 false 的值。
  • nil: 代表 undefined 的值。
  • FILE: 当前源文件的名称。
  • LINE: 当前行在源文件中的编号。

Ruby 运算符

Ruby 支持一套丰富的运算符。大多数运算符实际上是方法调用。例如,a + b 被解释为 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数。

对于每个运算符(+ - / % * & | ^ << >> && ||),都有一个相对应的缩写赋值运算符(+= -= 等等)。

Ruby 算术运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

39d049790019568acdcc396aa6a9ab6a.png

Ruby 比较运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

7c525cdfd73c3a0616c791c720f63291.png

Ruby 赋值运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

5bc41a3eca80c587b219fe33bd93eaeb.png

Ruby 并行赋值

Ruby 也支持变量的并行赋值。这使得多个变量可以通过一行的 Ruby 代码进行初始化。例如:

a = 10
b = 20
c = 30

使用并行赋值可以更快地声明:

a, b, c = 10, 20, 30

并行赋值在交换两个变量的值时也很有用:

a, b = b, c

Ruby 位运算符

位运算符作用于位,并逐位执行操作。

假设如果 a = 60,且 b = 13,现在以二进制格式,它们如下所示:

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

下表列出了 Ruby 支持的位运算符。

b678032165822ab8c70bc0babccd253e.png

Ruby 逻辑运算符

下表列出了 Ruby 支持的逻辑运算符。

假设变量 a 的值为 10,变量 b 的值为 20,那么:

7fccdf20d10f875ea4a6afb15e89d0ab.png

Ruby 三元运算符

有一个以上的操作称为三元运算符。第一个计算表达式的真假值,然后根据这个结果决定执行后边两个语句中的一个。条件运算符的语法如下:

76a07eae1c1cf24bdf705d17775e210e.png

Ruby 范围运算符

在 Ruby 中,序列范围用于创建一系列连续的值 - 包含起始值、结束值(视情况而定)和它们之间的值。

在 Ruby 中,这些序列是使用 ".." 和 "..." 范围运算符来创建的。两点形式创建的范围包含起始值和结束值,三点形式创建的范围只包含起始值不包含结束值。

c353094de5d2b3c5b602e22af9ffc73a.png

Ruby defined? 运算符

defined? 是一个特殊的运算符,以方法调用的形式来判断传递的表达式是否已定义。它返回表达式的描述字符串,如果表达式未定义则返回 nil

下面是 defined? 运算符的各种用法:

用法 1

defined? variable # 如果 variable 已经初始化,则为 True

例如:

foo = 42
defined? foo    # => "local-variable"
defined? $_     # => "global-variable"
defined? bar    # => nil(未定义)

用法 2

defined? method_call # 如果方法已经定义,则为 True

例如:

defined? puts        # => "method"
defined? puts(bar)   # => nil(在这里 bar 未定义)
defined? unpack      # => nil(在这里未定义)

用法 3

# 如果存在可被 super 用户调用的方法,则为 True
defined? super

例如:

defined? super     # => "super"(如果可被调用)
defined? super     # => nil(如果不可被调用)

用法 4

defined? yield   # 如果已传递代码块,则为 True

例如:

defined? yield    # => "yield"(如果已传递块)
defined? yield    # => nil(如果未传递块)

Ruby 点运算符 "." 和双冒号运算符 "::"

您可以通过在方法名称前加上模块名称和一条下划线来调用模块方法。您可以使用模块名称和两个冒号来引用一个常量。

:: 是一元运算符,允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。

请记住:在 Ruby 中,类和方法也可以被当作常量。

您只需要在表达式的常量名前加上 :: 前缀,即可返回适当的类或模块对象。

如果未使用前缀表达式,则默认使用主 Object 类。

下面是两个实例:

MR_COUNT = 0        # 定义在主 Object 类上的常量
module Foo
  MR_COUNT = 0
  ::MR_COUNT = 1    # 设置全局计数为 1
  MR_COUNT = 2      # 设置局部计数为 2
end
puts MR_COUNT       # 这是全局常量
puts Foo::MR_COUNT  # 这是 "Foo" 的局部常量

第二个实例:

CONST = ' out there'
class Inside_one
   CONST = proc {' in there'}
   def where_is_my_CONST
      ::CONST + ' inside one'
   end
end
class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

Ruby 运算符的优先级

下表按照运算符的优先级从高到低列出了所有的运算符。

fb1b946021aee3f54094427d73511db9.png

注意:在方法列标识为 的运算符实际上是方法,因此可以被重载。

Ruby 注释

注释是在运行时会被忽略的 Ruby 代码内的注释行。单行注释以 # 字符开始,直到该行结束,如下所示:

#!/usr/bin/ruby -w

# 这是一个单行注释。

puts "Hello, Ruby!"

当执行时,上面的程序会产生以下结果:

Hello, Ruby!

Ruby 多行注释

您可以使用 =begin=end 语法注释多行,如下所示:

#!/usr/bin/ruby -w

puts "Hello, Ruby!"

=begin
这是一个多行注释。
可扩展至任意数量的行。
但 =begin 和 =end 只能出现在第一行和最后一行。 
=end

当执行时,上面的程序会产生以下结果:

Hello, Ruby!

请确保尾部的注释离代码有足够的距离,以便容易区分注释和代码。如果块中超过一条尾部注释,请对齐它们。例如:

@counter      # 跟踪页面被击中的次数
@siteCounter  # 跟踪所有页面被击中的次数
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐