賦值
乙個賦值表示式可以為乙個或多個左值(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,...