运算符优先度
高
::
[]
+(单项) !
~
**
-
(单项)
* /
%
+
-
<<
>>
&
|
^
> >= <
<=
<=> == === !=
=~ !~
&&
||
..
...
?:(条件操作符)
=(+=, -= ...
)
not
低 and or
赋值:语法
表达式1 op= 表达式2
op可以是下列中某一个。
+, -, *, /, %, **, &, |, ^,
<<, >>, &&, ||
等同于
表达式1 = 表达式1 op 表达式2
但,当op
是“&&”或“||”时则: 表达式1
op (表达式1 = 表达式2)
这个样子。如在属性调用时
obj.foo ||= true
应是 obj.foo || (obj.foo = true)
多重赋值:
foo, bar, baz = 1, 2, 3
foo, = list()
foo, *rest = list2()
语法:
表达式 [`,' [表达式 `,' ... ] [`*' [表达式]]] = 表达式 [, 表达式 ...
][`*' 表达式]
`*' [表达式] = 表达式 [, 表达式 ... ][`*' 表达式]
多重赋值是指,在多个表达式以及数组中同时进行的赋值。左边的各个表达式必须是可以被赋值的。若右边只有一个表达式时,则将该表达式的计算值转为数组后,再把数组中的各个元素依次赋值给左边。若右边数组元素的数量超过左边的话,将忽略多余的数组元素。若右边数组元素个数不足的话,将向左边多余的元素中代入nil。
若左边最后一个表达式前带*的话,则将右边多余的元素以数组的形式代入这个带*的表达式中。若右边没有多余元素的话,就把空数组代入其中。
例:
foo, bar = [1, 2] # foo = 1; bar = 2
foo, bar = 1, 2 # foo = 1; bar = 2
foo, bar = 1 # foo = 1; bar = nil
foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil
foo, bar = 1, 2, 3 # foo = 1; bar = 2
foo = 1, 2, 3 # foo = [1, 2, 3]
*foo = 1, 2, 3 # foo = [1, 2, 3]
foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3]
在多重赋值过程中,若使用括号的话,就可以把数组内含的元素取出来进行赋值。
(foo, bar), baz = [1, 2], 3 # foo = 1; bar = 2; baz = 3
还可以把特殊形式的赋值表达式转化为多重代入。
class C
def foo=( v )
@foo = v
end
def []=(i,v)
@bar = ["a", "b", "c"]
@bar[i] = v
end
end
obj = C.new
obj.foo, obj[2] = 1, 2 # @foo = 1; @bar = ["a", "b", 2]
若左边以","结尾或"*"后面没有表达式时,将忽略右边多余的元素。
foo,* = 1, 2,
3 # foo = 1
foo, = 1,
2, 3 # foo =
1
* = 1, 2,
3
当您想忽略方法调用中的所有参数时,就可以使用这个"*"
def
foo(*)
end
foo(1,2,3)
多重赋值的值变换为右边的数组。
范围表达式
如: 1 .. 20
语法为:
表达式1 .. 表达式2
表达式1 ... 表达式2
不包含终点,就像a<= x <
b一样。
如果不是出现在条件表达式中的话,它将返回从表达式1到表达式2的范围对象。
范围对象是Range类的实例。
若它出现在条件表达式中时,在表达式1变成真之前,它将一直返回伪。接下来,在表达式2返回真之前,它将一直返回真。一旦表达式2变为真,它将重新返回伪。
使用".."时,一旦表达式1返回真,马上就会对表达式2进行计算(就象awk)。
而使用"..."时,在进行下个计算之前,一直都不会对表达式2进行计算(就象sed)。
就这样理解就行,细节等用时再看。
and
表达式 `&&' 表达式
表达式 `and' 表达式
or
表达式 `||' 表达式
表达式 or 表达式
not
`!' 表达式
not 表达式
表达式 `!='
表达式 <====>!(表达式 == 表达式)
。
表达式 `!~' 表达式 <====>!(表达式 =~ 表达式)
。
将包含not
的表达式传递给某方法的参数时,必须使用双层括号。
p(!
false) #=> true
p((not false)) #=>
true
条件操作符
obj == 1 ? foo : bar
语法:
表达式1 ? 表达式2 : 表达式3
和C是一致的。