一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Ruby參考手冊 - 操作符表達式

 interguycn 2006-05-01

操作符表達式

例:

1+2*3/4

為了便于編程,有些方法調(diào)用和控制結(jié)構(gòu)是以操作符的形式出現(xiàn)的。Ruby語言中有下列操作符。

高     ::
[]
+(單項)  !  ~
**
-(單項)
*  /  %
+  -
<< >>
&
|  ^
> >=  < <=
<=> ==  === !=  =~  !~
&&
||
..  ...
?:(條件操作符)
=(+=, -= ... )
not
低     and or

左側(cè)的“高”和“低”表示操作符的優(yōu)先度。例如“&&”的優(yōu)先度要高于“||”,所以

a && b || c   #=> (a && b) || c
a || b && c   #=>  a || (b && c)

大部分操作符都是些特殊形式的方法調(diào)用,但有的操作符被嵌入語言之中,無法進行再定義。

  • 可再定義的操作符(方法):

    +@, -@表示單項操作符+, -,在方法定義等場合中可以使用這種表示法。

    |  ^  &  <=>  ==  ===  =~  >   >=  <   <=   <<  >>
        +  -  *  /    %   **   ~   +@  -@  []  []=  `
        
  • 不可再定義的操作符(控制結(jié)構(gòu)):

    由多個操作符組合而成的計算賦值操作符、“!=”以及“!~”是不能再定義的。

    =  ?:  ..  ...  !  not  &&  and  ||  or  ::
        

賦值

例:

foo = bar
foo[0] = bar
foo.bar = baz

語法:

變量 ‘=‘ 表達式
常數(shù) ‘=‘ 表達式
表達式`[‘expr..`]‘ ‘=‘ 表達式
表達式`.‘標識符 ‘=‘ 表達式

我們使用賦值表達式向變量等對象進行賦值。賦值也可以用作局部變量和常數(shù)的聲明。賦值表達式的左邊必須是下列之一。

  • 變量

    變量 `=‘ 表達式
        

    若左邊是變量的話,就將表達式的計算值代入其中。

  • 數(shù)組調(diào)用

    表達式1`[‘ 表達式2 ... `]‘ `=‘ 表達式n
        

    先計算表達式1得到一個對象,再把從表達式2到表達式n之間的這些表達式作為參數(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)用

    表達式1 `.‘ 標識符 `=‘ 表達式2
        

    計算表達式1得到一個對象,再以表達式2為參數(shù)來調(dià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 + 12
a ||= 1         # 若a為偽或者a尚未定義,就把1賦值給a。初始化時的一種習(xí)慣寫法。

語法:

表達式1 op= 表達式2     # 表達式1等同于普通賦值表達式左邊的部分

op就是下列中的某一個。操作符與=之間不留間隔。

+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||

這種賦值形式等同于

表達式1 = 表達式1 op 表達式2

但是,當op是“&&”或“||”時就會變成

表達式1 op (表達式1 = 表達式2)

這個樣子。例如在屬性調(diào)用時

obj.foo ||= true

就不能解釋成

obj.foo = obj.foo || true

而應(yīng)該是

obj.foo || (obj.foo = true)

這樣才對。(根據(jù)obj.foo結(jié)果的不同,有時就不能調(diào)用obj.foo=)

多重賦值

例:

foo, bar, baz = 1, 2, 3
foo, = list()
foo, *rest = list2()

語法:

表達式 [`,‘ [表達式 `,‘ ... ] [`*‘ [表達式]]] = 表達式 [, 表達式 ... ][`*‘ 表達式]
`*‘ [表達式] = 表達式 [, 表達式 ... ][`*‘ 表達式]

多重賦值是指,在多個表達式以及數(shù)組中同時進行的賦值。左邊的各個表達式必須是可以被賦值的。若右邊只有一個表達式時,則將該表達式的計算值轉(zhuǎn)為數(shù)組后,再把數(shù)組中的各個元素依次賦值給左邊。若右邊數(shù)組元素的數(shù)量超過左邊的話,將忽略多余的數(shù)組元素。若右邊數(shù)組元素個數(shù)不足的話,將向左邊多余的元素中代入nil。

若左邊最后一個表達式前帶*的話,則將右邊多余的元素以數(shù)組的形式代入這個帶*的表達式中。若右邊沒有多余元素的話,就把空數(shù)組代入其中。

例:

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]

在多重賦值過程中,若使用括號的話,就可以把數(shù)組內(nèi)含的元素取出來進行賦值。

(foo, bar), baz = [1, 2], 3       # foo = 1; bar = 2; baz = 3

還可以把特殊形式的賦值表達式轉(zhuǎn)化為多重代入。

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]

若左邊以","結(jié)尾或"*"后面沒有表達式時,將忽略右邊多余的元素。

例:

foo,*    = 1, 2, 3      # foo = 1
foo,     = 1, 2, 3      # foo = 1
*        = 1, 2, 3

當您想忽略方法調(diào)用中的所有參數(shù)時,就可以使用這個"*"(方法調(diào)用中的參數(shù)在進行交接時,大體遵循多重代入的規(guī)則)。

例:

def foo(*)
end
foo(1,2,3)

多重賦值的值變換為右邊的數(shù)組。

范圍表達式

例:

1 .. 20
/first/  ...  /second/

語法:

表達式1 `..‘ 表達式2
表達式1 ` ... ‘ 表達式2

如果不是出現(xiàn)在條件表達式中的話,它將返回從表達式1到表達式2的范圍對象。范圍對象是 Range 類的實例。使用"..."生成的范圍對象將不包括終點。

若它出現(xiàn)在條件表達式中時,在表達式1變成真之前,它將一直返回偽。接下來,在表達式2返回真之前,它將一直返回真。一旦表達式2變?yōu)檎妫鼘⒅匦路祷貍?。使?.."時,一旦表達式1返回真,馬上就會對表達式2進行計算(就象awk)。而使用"..."時,在進行下個計算之前,一直都不會對表達式2進行計算(就象sed)。

and

例:

test && set
test and set

語法:

表達式 `&&‘ 表達式
表達式 `and‘ 表達式

首先計算左邊,若結(jié)果為真就接著計算右邊。"and"操作符的作用相同但優(yōu)先度更低。

將包含and的表達式傳遞給某方法的參數(shù)時,必須使用雙層括號。

p(true && false)    #=> false
p((true and false)) #=> false

or

例:

demo || die
demo or die

語法:

表達式 `||‘ 表達式
表達式 or 表達式

首先計算左邊,若結(jié)果為偽就接著計算右邊。"or"操作符的作用相同但優(yōu)先度更低。

將包含or的表達式傳遞給某方法的參數(shù)時,必須使用雙層括號。

p(false || true)    #=> true
p((false or true)) #=> true

not

例:

! me
not me
i != you

語法:

`!‘ 表達式
not 表達式

若表達式值為真就返回偽,若表達式值為偽則返回真。

表達式 `!=‘ 表達式

等同于!(表達式 == 表達式)。

表達式 `!~‘ 表達式

等同于!(表達式 =~ 表達式)。

將包含not的表達式傳遞給某方法的參數(shù)時,必須使用雙層括號。

p(! false)      #=> true
p((not false))  #=> true

條件操作符

例:

obj == 1 ? foo : bar

語法:

表達式1 ? 表達式2 : 表達式3

根據(jù)表達式1的結(jié)果,選擇返回表達式2或表達式3。它與

if 表達式1 then 表達式2 else 表達式3 end

完全相同。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    成年人免费看国产视频| 成人午夜爽爽爽免费视频| 亚洲欧美国产网爆精品| 亚洲一区二区亚洲日本| 欧美日韩三区在线观看| 国产精品亚洲二区三区| 深夜视频成人在线观看| 欧美一级黄片欧美精品| 国产一区二区三区精品免费| 丰满的人妻一区二区三区| 日本加勒比在线播放一区| 欧美韩国日本精品在线| 欧美一区二区三区喷汁尤物| 日韩中文字幕欧美亚洲| 日韩特级黄片免费观看| 91国自产精品中文字幕亚洲| 欧美日韩国产福利在线观看| 国产精品午夜福利免费阅读| 国产老熟女乱子人伦视频| 欧美日韩在线第一页日韩| 欧美小黄片在线一级观看| 欧美人与动牲交a精品| 天海翼精品久久中文字幕 | 91久久国产福利自产拍 | 美女极度色诱视频在线观看| 中文久久乱码一区二区| 色欧美一区二区三区在线| 国产午夜精品在线免费看| 亚洲欧美日本国产有色| 亚洲综合精品天堂夜夜| 在线观看欧美视频一区| 日韩一区二区三区四区乱码视频| 欧美小黄片在线一级观看| 日韩不卡一区二区在线| 狠狠干狠狠操亚洲综合| 色婷婷久久五月中文字幕| 国产成人一区二区三区久久| 亚洲国产成人久久99精品| 日本加勒比中文在线观看| 一区二区日韩欧美精品| 中文字幕日韩无套内射|