例:
1+2*3/4
為了便于編程,有些方法調(diào)用和控制結(jié)構(gòu)是以操作符的形式出現(xiàn)的。Ruby語言中有下列操作符。
高 ::[]+(單項(xiàng)) ! ~**-(單項(xiàng))* / %+ -<< >>&| ^> >= < <=<=> == === != =~ !~&&||.. ...?:(條件操作符)=(+=, -= ... )not低 and or
左側(cè)的“高”和“低”表示操作符的優(yōu)先度。例如“&&”的優(yōu)先度要高于“||”,所以
a && b || c #=> (a && b) || ca || b && c #=> a || (b && c)
大部分操作符都是些特殊形式的方法調(diào)用,但有的操作符被嵌入語言之中,無法進(jìn)行再定義。
可再定義的操作符(方法):
+@
, -@
表示單項(xiàng)操作符+
, -
,在方法定義等場合中可以使用這種表示法。
| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= `
不可再定義的操作符(控制結(jié)構(gòu)):
由多個(gè)操作符組合而成的計(jì)算賦值操作符、“!=”以及“!~”是不能再定義的。
= ?: .. ... ! not && and || or ::
例:
foo = barfoo[0] = barfoo.bar = baz
語法:
變量 ‘=‘ 表達(dá)式常數(shù) ‘=‘ 表達(dá)式表達(dá)式`[‘expr..`]‘ ‘=‘ 表達(dá)式表達(dá)式`.‘標(biāo)識符 ‘=‘ 表達(dá)式
我們使用賦值表達(dá)式向變量等對象進(jìn)行賦值。賦值也可以用作局部變量和常數(shù)的聲明。賦值表達(dá)式的左邊必須是下列之一。
變量
變量 `=‘ 表達(dá)式
若左邊是變量的話,就將表達(dá)式的計(jì)算值代入其中。
數(shù)組調(diào)用
表達(dá)式1`[‘ 表達(dá)式2 ... `]‘ `=‘ 表達(dá)式n
先計(jì)算表達(dá)式1得到一個(gè)對象,再把從表達(dá)式2到表達(dá)式n之間的這些表達(dá)式作為參數(shù),來調(diào)用該對象的"[]="方法。
例:
class C def initialize @ary = [0,1,2,3,4,5,6,7] end def [](i) @ary[i * 2] end def []=( i, v ) @ary[i * 2] = v end end c = C.new p c[3] # 變成 c.[]( 3 ), 結(jié)果為6 p c[3] = 1 # 變成 c.[]=(3,1),結(jié)果為1
屬性調(diào)用
表達(dá)式1 `.‘ 標(biāo)識符 `=‘ 表達(dá)式2
計(jì)算表達(dá)式1得到一個(gè)對象,再以表達(dá)式2為參數(shù)來調(diào)用該對象的"標(biāo)識符="方法。
例:
class C def foo @foo end def foo=( v ) @foo = v end end c = C.new c.foo = 5 # 變成 c.foo=( 5 ) p c.foo # => 5
還可以使用 attr 來定義屬性。
例:
class C attr :foo, true end c = C.new c.foo = 5 # 變成 c.foo=( 5 ) p c.foo # => 5
例:
foo += 12 # foo = foo + 12a ||= 1 # 若a為偽或者a尚未定義,就把1賦值給a。初始化時(shí)的一種習(xí)慣寫法。
語法:
表達(dá)式1 op= 表達(dá)式2 # 表達(dá)式1等同于普通賦值表達(dá)式左邊的部分
op就是下列中的某一個(gè)。操作符與=
之間不留間隔。
+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||
這種賦值形式等同于
表達(dá)式1 = 表達(dá)式1 op 表達(dá)式2
但是,當(dāng)op
是“&&”或“||”時(shí)就會變成
表達(dá)式1 op (表達(dá)式1 = 表達(dá)式2)
這個(gè)樣子。例如在屬性調(diào)用時(shí)
obj.foo ||= true
就不能解釋成
obj.foo = obj.foo || true
而應(yīng)該是
obj.foo || (obj.foo = true)
這樣才對。(根據(jù)obj.foo結(jié)果的不同,有時(shí)就不能調(diào)用obj.foo=)
例:
foo, bar, baz = 1, 2, 3foo, = list()foo, *rest = list2()
語法:
表達(dá)式 [`,‘ [表達(dá)式 `,‘ ... ] [`*‘ [表達(dá)式]]] = 表達(dá)式 [, 表達(dá)式 ... ][`*‘ 表達(dá)式]`*‘ [表達(dá)式] = 表達(dá)式 [, 表達(dá)式 ... ][`*‘ 表達(dá)式]
多重賦值是指,在多個(gè)表達(dá)式以及數(shù)組中同時(shí)進(jìn)行的賦值。左邊的各個(gè)表達(dá)式必須是可以被賦值的。若右邊只有一個(gè)表達(dá)式時(shí),則將該表達(dá)式的計(jì)算值轉(zhuǎn)為數(shù)組后,再把數(shù)組中的各個(gè)元素依次賦值給左邊。若右邊數(shù)組元素的數(shù)量超過左邊的話,將忽略多余的數(shù)組元素。若右邊數(shù)組元素個(gè)數(shù)不足的話,將向左邊多余的元素中代入nil。
若左邊最后一個(gè)表達(dá)式前帶*的話,則將右邊多余的元素以數(shù)組的形式代入這個(gè)帶*的表達(dá)式中。若右邊沒有多余元素的話,就把空數(shù)組代入其中。
例:
foo, bar = [1, 2] # foo = 1; bar = 2foo, bar = 1, 2 # foo = 1; bar = 2foo, bar = 1 # foo = 1; bar = nilfoo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nilfoo, bar = 1, 2, 3 # foo = 1; bar = 2foo = 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]
在多重賦值過程中,若使用括號的話,就可以把數(shù)組內(nèi)含的元素取出來進(jìn)行賦值。
(foo, bar), baz = [1, 2], 3 # foo = 1; bar = 2; baz = 3
還可以把特殊形式的賦值表達(dá)式轉(zhuǎn)化為多重代入。
class Cdef foo=( v )@foo = venddef []=(i,v)@bar = ["a", "b", "c"]@bar[i] = vendendobj = C.newobj.foo, obj[2] = 1, 2 # @foo = 1; @bar = ["a", "b", 2]
若左邊以","結(jié)尾或"*"后面沒有表達(dá)式時(shí),將忽略右邊多余的元素。
例:
foo,* = 1, 2, 3 # foo = 1foo, = 1, 2, 3 # foo = 1* = 1, 2, 3
當(dāng)您想忽略方法調(diào)用中的所有參數(shù)時(shí),就可以使用這個(gè)"*"(方法調(diào)用中的參數(shù)在進(jìn)行交接時(shí),大體遵循多重代入的規(guī)則)。
例:
def foo(*)endfoo(1,2,3)
多重賦值的值變換為右邊的數(shù)組。
例:
1 .. 20/first/ ... /second/
語法:
表達(dá)式1 `..‘ 表達(dá)式2表達(dá)式1 ` ... ‘ 表達(dá)式2
如果不是出現(xiàn)在條件表達(dá)式中的話,它將返回從表達(dá)式1到表達(dá)式2的范圍對象。范圍對象是 Range 類的實(shí)例。使用"..."生成的范圍對象將不包括終點(diǎn)。
若它出現(xiàn)在條件表達(dá)式中時(shí),在表達(dá)式1變成真之前,它將一直返回偽。接下來,在表達(dá)式2返回真之前,它將一直返回真。一旦表達(dá)式2變?yōu)檎妫鼘⒅匦路祷貍?。使?.."時(shí),一旦表達(dá)式1返回真,馬上就會對表達(dá)式2進(jìn)行計(jì)算(就象awk)。而使用"..."時(shí),在進(jìn)行下個(gè)計(jì)算之前,一直都不會對表達(dá)式2進(jìn)行計(jì)算(就象sed)。
例:
test && settest and set
語法:
表達(dá)式 `&&‘ 表達(dá)式表達(dá)式 `and‘ 表達(dá)式
首先計(jì)算左邊,若結(jié)果為真就接著計(jì)算右邊。"and"操作符的作用相同但優(yōu)先度更低。
將包含and
的表達(dá)式傳遞給某方法的參數(shù)時(shí),必須使用雙層括號。
p(true && false) #=> falsep((true and false)) #=> false
例:
demo || diedemo or die
語法:
表達(dá)式 `||‘ 表達(dá)式表達(dá)式 or 表達(dá)式
首先計(jì)算左邊,若結(jié)果為偽就接著計(jì)算右邊。"or"操作符的作用相同但優(yōu)先度更低。
將包含or
的表達(dá)式傳遞給某方法的參數(shù)時(shí),必須使用雙層括號。
p(false || true) #=> truep((false or true)) #=> true
例:
! menot mei != you
語法:
`!‘ 表達(dá)式not 表達(dá)式
若表達(dá)式值為真就返回偽,若表達(dá)式值為偽則返回真。
表達(dá)式 `!=‘ 表達(dá)式
等同于!(表達(dá)式 == 表達(dá)式)
。
表達(dá)式 `!~‘ 表達(dá)式
等同于!(表達(dá)式 =~ 表達(dá)式)
。
將包含not
的表達(dá)式傳遞給某方法的參數(shù)時(shí),必須使用雙層括號。
p(! false) #=> truep((not false)) #=> true
例:
obj == 1 ? foo : bar
語法:
表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3
根據(jù)表達(dá)式1的結(jié)果,選擇返回表達(dá)式2或表達(dá)式3。它與
if 表達(dá)式1 then 表達(dá)式2 else 表達(dá)式3 end
完全相同。