娃娃鴨學Ruby 23 賦值

2021-08-31 10:07:29 字數 3264 閱讀 1882

賦值

乙個賦值表示式可以為乙個或多個左值(lvalue)指定乙個或多個值。

左值 可以出現在乙個賦值操作符左側的東西。

在ruby中變數、常量、屬性及陣列元素是左值。

在ruby中三種不同形式的賦值表示式。

x=1x,y,z=1,2,3 # set x to 1,y to 2 ,z to 3

x=y=0 #從右到左的順序依次求值

冪等賦值操作不是冪等的。

1、對變數進行賦值

ruby擁有四種型別的變數:區域性變數、全域性變數、例項變數及類變數

賦值操作的行為是一樣的

ruby的例項變數是永遠不可見的。

point.x,point.y=1,2

左值不是變數而是屬性。

class ambiguous

def x;1;end # 方法x,返回值1

def test

puts x

x=0 if false

puts x # x 是一變數,沒有被賦值,列印nil

x=2 #賦值

puts x #列印2

endend

2、對常量賦值

常量變數區別

常量在程式執行期間,值保持不變

針對常量賦值的特殊規則:

1)已存在的常量進行賦值會導致ruby發出乙個警告,然後ruby仍然會執行這個賦值,意味著常量並不是真正恆久不變的

2)方法體內部是不允許對常量進行賦值的

3、對屬性和陣列元素的賦值

ruby中對屬性或陣列元素的賦值其實是對方法呼叫的簡寫。

物件具有名為m=的方法,方法名的最後乙個字元是等號,那麼o.m可以作為賦值表示式的右值。

更進一步

o.m=v

ruby直譯器將轉換成:

o.m=(v)

=o[x]=y # o.=(x,y)

o[x,y]=z # o.=(x,y,z)

4、縮寫形式的賦值

x+=1

+=並不是真正的ruby操作符,只是縮寫

x=x+1

縮寫僅在只有乙個左值和乙個右值的情況下才有效的。

當左值是乙個屬性時,可以採用縮寫形式

o.m+=1

o.m=(o.m()+1)

當左傳舊乙個陣列元素時,可採用縮寫

o[x]-=2

o. =(x,o.(x)-2)

常見的縮寫:

賦值操作 展開形式

x+=y x=x+y

x-=y x=x-y

x*=y x=x*y

x/=y x=x/y

x%=y x=x%y

x**=y x=x**y

x&&=y x=x&&y

x||=y x=x||y

x&=y x=x&y

x|=y x=x|y

x^=y x=x^y

x<<=y x=x<>=y x=x>>y

result ||=

result= result ||

5、並行賦值

多個左值之間採用逗號進行分隔,多個右值之間也是如此。

幾種情況:

1)左值和右值的數量相等

x, y, z =1, 2, 3 # x=1;y=2;z=3

x,y=y,x #交換兩變數

x=y;y=x # 兩值相同

2)乙個左值,多個右值

ruby會建立乙個陣列來容納所有右值,並賦給左值

x=1,2,3 # x=[1,2,3]

可以在左值前放乙個*,不會改變這個賦值操作的意義,也不會改變返回值。

不希望出現多個右值被放到乙個陣列,在左值後接乙個逗號

x,=1,2,3 # x=1;其他值無效

3)多個左值,乙個陣列右值

當有多個左值,但是只有乙個右值時。

ruby試圖將右值擴充套件成乙個值列表,然後再進行賦值。

x,y,z=[1,2,3] # x,y,z=1,2,3

x=[1,2] #x變在[1,2]

x,=[1,2] #x=1,

4)左值和右值的數量不同

左值多,多的用nil

右值多,多的丟棄

x,y,z=1,2 # x=1;y=2;z=nil

x,y=1,2,3 # x=1;y=2;3丟棄

5)展開操作符

如果乙個右值以*開頭,就意味著它是乙個陣列(或乙個類似於陣列的物件)

x,y,z=1,*[2,3] # same as x,y,z=1,2,3

在ruby1.8中*只能出現在最後乙個右值的前面

在ruby1.9中乙個並行賦值的右值列表裡可以出現任意多個*,而且它們可以出現在列表的任何位置。

**都是非法的

x,y=**[[1,2]] #syntaxerror!

當乙個左值前放*時,意味著所有多外出來的右值都被放入乙個陣列並賦給該左值。

x,*y=1,2,3 # x=1;y=[2,3]

x,*y=1,2 # x=1;y=[2]

x,*y=1 #x=1;y=

在ruby1.8裡,*只能出現在最後乙個左值的前面

ruby1.9裡,並行賦值的左側只能出現乙個*,但是它右以出現在左側任何位置。

*x,y=1,2,3 #x=[1,2] ; y=3

*x,y=1,2 #x=[1];y=2

*x,y=1 #x=;y=1

兩側都出現*

x,y,*z=1,*[2,3,4] # x=1,y=2,z=[3,4]

6)並行賦值中的圓括號

子賦值x,(y,z)=a,b

同時進行兩個賦值操作

x=ay,z=b

x,y,z=1,[2,3] # x=1,y=[2,3];z=nil

x,(y,z)=1,[2,3] #x=1,y=2,z=3

a,b,c,d=[1,[2,[3,4]]] # no parens : a=1;b=[2,[3,4]];c=d=nil

a,(b,(c,d))=[1,[2,[3,4]]] # parens:a=1,b=2,c=3,d=4

7)並行賦值的值

並行賦值表示式的返回值是所有右值構成的陣列。

如果乙個並行賦值緊跟在乙個方法名之後,ruby不會將並行賦值中的逗號解釋成左值和右值之間的分隔符,而是解釋成該方法的引數分隔符。

puts x,y=1,2

ruby認為:puts三個引數:x,y=1以及2

puts (x,y=1,2) #還是不行,因為在ruby中括號可以省略

如果想並行賦值:

puts((x,y-1,2)) #這樣才行。

2011-4-10 16:19 danny

娃娃鴨學Ruby 注釋

1 注釋 注釋以 字元開頭並持續到該行結束 如果 字元出現在乙個字串或正規表示式字面量裡,那麼它將作為此字串或正規表示式的一部分而非引入一段注釋。this entire line is a comment x this is a string y this is a regular expressi...

娃娃鴨學Ruby 25 If

if if 是最簡單的條件式,具有多種形式 if expression code end expression的值不是false或nil執行 可以有關鍵字 then if x 10 x 1 endif x 10 then x 1 end if x 10 then x 1 end1 else if e...

娃娃鴨學Ruby 13 陣列

b 陣列 b 乙個陣列就是一系列的值,可以通過這些值在該序列中的位置或索引來訪問它們。ruby中 陣列的第乙個值的索引為0 size和length方法返回乙個陣列的元素個數,最後乙個元素的索引是size 1 負索引從陣列的末尾開始計數 1 表示陣列的最後乙個元素,倒數第二個為 2 越界 返回nil,...