1. 基本表达式
没啥好说的~~~~~ 唯一要注意的就是 Ruby 不支持自加(++)和自减(--),可以使用 += 和 -= 代替。
1 + 2 a = 3 a += 4
2. 命令展开
在 Ruby 中,我们可以直接用反引号(`)执行系统命令。其实只是执行了 Kernel.`() 方法,不过把这个当作表达式,感觉有点古怪。
puts `ver`
输出:
Microsoft Windows XP [版本 5.1.2600]
当然,我们可以重载这个方法。
def `(cmd) "Command:#{cmd}\n" + Kernel.`(cmd) end puts `ver`
3. 赋值
基本赋值语句
a = b = c = 1 # a = 1, b = 1, c = 1 a = (b = 1 + 2) + 3 # a = 6, b = 3
并行赋值语句 (看下面的代码,估计会有点晕~~~~)
a = 1 b = 2 a, b = b, a puts a, b
输出:
2
1
其实很简单,接着看下面的规则。
(1) 在赋值操作之前,首先按顺序计算右边的值,并将其保存到数组中。
x = 0 a, b, c = x, (x += 1), (x += 2) puts a, b, c
输出:
0
1
3
(2) 当赋值语句多于一个左值时,表达式将返回由右值组成的数组。
(3) 如果赋值语句的左值多于右值,多于左值被忽略。
a, b, c = 0, 1 puts a, b, c
输出:
0
1
nil
(4) 如果右值多于左值,额外的右值被忽略。
(5) 如果仅有一个左值而有多个右值,则左值直接被赋值为数组。
a = 0, 1 puts a.class puts a
输出:
Array
0
1
(6) 如果最后一个左值有一个 "*" 前缀,则多余的右值以数组方式赋值给该变量。
a, b, *c = 1, 2, 3, 4, 5 puts a puts b puts "------------" puts c
输出:
1
2
------------
3
4
5
还有几种复杂点的。
a = [1, 2, 3, 4, 5] b, c = 99, a # b=99, c=[1,2,3,4,5] b, *c = 99, a # b=99, c=[[1,2,3,4,5]] b, c = 99, *a # b=99, c=1 b, *c = 99, *a # b=99, c=[1,2,3,4,5]
还有一种嵌套赋值语句。
a, (b, c), d = 1, 2, 3, 4 puts a, b, c, d
输出:
1
2
nil
3
看不明白?很简单,括号内的变量在第一次赋值操作时被当作一个变量处理,根据并行赋值规则,自然只有一个 "2" 了。然后对括号内的变量进行第二轮赋值,自然 c = nil 。
a, (b, c), d = 1, [2, 3], 4 puts a, b, c, d
输出:
1
2
3
4
a, (b, *c), d = 1, [2, 3, 100], 4 puts b, "----", c
输出:
2
----
3
100
4. 布尔表达式
Ruby 对 "真" 的定义很简单:任何不是 nil 或者 false 的值都是 true,所以下面的演示中,尽管 line 的值是字符串,依然可以完成整个循环。
while line = gets puts line end
Ruby 的布尔判断采取 "短路求解"(当第一个操作书符合或不符合时,放弃后续判断),同时定义了新的操作符 "defined?" 来判断参数是否已经被定义。
puts defined?(a) a = 1 puts defined?(a)
输出:
nil
local-variable
如果参数未定义,defined? 返回 nil,否则返回一个标记字符串。
和我们所习惯的布尔表达式不同的是,Ruby 操作符 &&、and、||、or 返回首个决定条件真伪参数值,而不是 true 或 false。
puts "a" && "b" # a 为真,所以决定表达式真伪的是 b,返回 b。 puts nil && "b" # nil 导致短路求解,故返回 nil。 puts "a" || "b" # 同样是短路求解,返回 a。