Ruby編程中的賦值相關(guān)操作
在老版本的Ruby中,賦值語(yǔ)句的返回值是設(shè)置該屬性的方法的返回值。在Ruby1.8中,賦值語(yǔ)句的值總是參數(shù)的值而方法的返回值將被丟掉。
class Test def val=(val) @val = val return 99 end end t = Test.new a = t.val=2 a ->2
在老版本中,a將被賦值語(yǔ)句設(shè)置為99,而在Ruby1.8中,它的值為2.
Ruby的賦值實(shí)際是以并行方式執(zhí)行的,所以賦值語(yǔ)句右邊的值不受賦值語(yǔ)句本身的影響。在左邊的任意一個(gè)變量或者屬性被賦值之前,右邊的值按它們出現(xiàn)的順序被計(jì)算出來(lái)。下面這個(gè)人為設(shè)計(jì)的例子說(shuō)明了這一點(diǎn)。第二行講表達(dá)式x ,x+=1和x+=1的值分別賦值給變量a、b和c。
x = 0 -> 0 a,b,c =x,(x+=1),(x+=1) ->[0,1,2]
當(dāng)賦值語(yǔ)句有多于一個(gè)左值時(shí),賦值表達(dá)式將返回由右值組成的數(shù)組。如果賦值語(yǔ)句的左值多于右值,那么多余的左值將被忽略。如果右值多余左值,那么額外的右值將被忽略。如果賦值語(yǔ)句僅有一個(gè)左值而有多個(gè)右值,那么右值將被轉(zhuǎn)換成數(shù)組,然后賦值給左值。
其實(shí),可寫屬性有個(gè)隱藏的陷阱。通常,類中的方法可以通過(guò)函數(shù)形式(即帶一個(gè)隱式self作為接收者)調(diào)用同一個(gè)類的其他方法和它的父類的方法。然而這不適用于屬性賦值函數(shù):Ruby看到賦值語(yǔ)句時(shí),會(huì)認(rèn)為左邊的名字是局部變量,而不是一個(gè)為屬性賦值的方法調(diào)用。
class BrokenAmplifier attr_accessor :left_channel, :right_channel def volume=(vol) left_channel = self.right_channel = vol end end ba = BrokenAmplifier.new ba.left_channel = ba.right_channel =99 ba.volume=5 ba.left_channel ->99 ba.right_channel ->5
在上面的賦值語(yǔ)句中,我們忘了給left_channel加"self."前綴,所以Ruby存儲(chǔ)新值給volume= 方法的局部變量,因?yàn)楦緵](méi)有更新對(duì)象屬性。這會(huì)成為難以追蹤的缺陷
相關(guān)文章
Ruby實(shí)現(xiàn)的最優(yōu)二叉查找樹(shù)算法
這篇文章主要介紹了Ruby實(shí)現(xiàn)的最優(yōu)二叉查找樹(shù)算法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05Ruby日期時(shí)間的比較,日期轉(zhuǎn)換等時(shí)間日期處理方法大全
這篇文章主要介紹了Ruby的日期時(shí)間處理方法與函數(shù),日期時(shí)間和字符串、數(shù)值之間的轉(zhuǎn)換,日期時(shí)間的比較需要的朋友可以參考下2022-04-04在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程
這篇文章主要介紹了在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程,包括介紹數(shù)據(jù)庫(kù)支持Ruby的接口等,是學(xué)習(xí)Ruby on Rails的基礎(chǔ),需要的朋友可以參考下2015-04-04GitHub倡導(dǎo)的Ruby代碼編寫風(fēng)格總結(jié)
GitHub網(wǎng)站服務(wù)器端主要就是使用的Ruby作為編程語(yǔ)言,因而GitHub所提倡采用的Ruby書寫規(guī)范也就顯得更有些說(shuō)服力XD 下面我們就整理除了這份GitHub倡導(dǎo)的Ruby代碼編寫風(fēng)格總結(jié),需要的朋友可以參考下2016-05-05