这篇文章是关于 Ruby 语法中表达式和操作符的一些值得注意的知识点。
关键字字面量
某些 Ruby 关键字是基本表达式,可以把它们当做关键字字面量来使用。包括,nil、true、false、self、FILE、LINE 和 ENCODING。
方法与变量
现在存在一个最简单的表达式:
x
如果存在一个名为 x 的变量(解释器见到了对 x 的赋值操作),那么就会当做成为一个变量的引用表达式。否则,就会被当做是在 self 对象上,对方法 x 的一次不带实参的调用。
常量赋值
对一个已经存在的常量进行赋值,Ruby 会发出一个警告,然而 Ruby 仍会进行这个赋值。在方法体的内部不允许对常量惊醒赋值。Ruby 认为方法可以被多次调用,如果每次调用都发出一个警告,那么干脆就不允许这样做了。
与变量不同,只有在 Ruby 解释器真正执行了常量赋值以后,这个常量才会存在。像下面这个表达式并不会产生一个常量。
N = 100 if false
并行赋值
左值和右值数量相等时最简单:
x, y, z = 1, 2, 3 # x=1, y=2, z=3
一个左值,多个右值时,Ruby 会创建一个数组来容纳所有的右值,同时你可以在左值后边接一个逗号,来表示不希望右值被合并成为一个数组。
x = 1, 2, 3 # x = [1, 2, 3]
x, = 1, 2, 3 # x=1
多个左值,一个数组右值(或是实现了 to_ary 的方法),那么 Ruby 会尝试展开右值。
x, y, x = [1, 2, 3] # x=1, y=2, z=3
左右值数量不等时,如果左值比右值多,那么每个剩余的左值会被赋值为 nil;如果右值比左值多时,剩余的右值将会全部被抛弃。
如果一个右值以 * 开头,那么意味着它是一个类数组对象(数组、范围、枚举器或者任何实现了 to_splat 方法的对象),则会自动展开该数组。
x, y, z = 1, *[2, 3] # x=1, y=2, z=3
右值列表可以出现任意多个 * ,但是任何在数组浅放置两个 ** 的都是非法的。
当一个左值前边放置一个 * 时,以为着所有多出来的右值都会被赋给该左值。赋给该左值的值总是一个数组,并且 * 可以出现在左值列表的任意位置。
*x, y = 1, 2, 3 # x = [1, 2], y=3
*x, y = 1, 2 # x=[1], y =3
*x, y = 1 #x=[], y=1
可以在并行赋值的左侧通过小括号来进行“子赋值”,例如:
x, (y, z) = 1, [2, 3] # x=1, y=2, z=3
所有并行赋值表达式的返回值为所有右值构成的数组(在右值所有的展开操作符展开以后)。