您好,登錄后才能下訂單哦!
在Ruby中,所有的class都是對(duì)象,是Class這個(gè)類的實(shí)例。
一、 類是對(duì)象
當(dāng)我們編寫一個(gè)新的class的時(shí)候(一般情況下使用class Name ... end ),我們實(shí)際上生成了一個(gè)Class類的對(duì)象同事將其賦予了一個(gè)全局變量(在這里Name就是這個(gè)全局變量)。當(dāng)我們調(diào)用Name.new來(lái)創(chuàng)建一個(gè)新的對(duì)象的時(shí)候,我們默認(rèn)地調(diào)用了Class中的new方法。我們可以通過(guò)覆寫Class類中的new方法來(lái)證明這一點(diǎn):
class Class alias oldNew new def new(*args) print "Creating a new ", self.name, "\n" oldNew(*args) end end class Name end n = Name.new
執(zhí)行這段代碼會(huì)產(chǎn)生這樣的輸出: Creating a new Name
二、Class.new do .... end
fred = Class.new do def meth2 "hello" end def meth3 "bye" end end a = fred.new #=> #<#<Class:0x100381890>:0x100376b98> a.meth2 #=> "hello" a.meth3 #=> "bye"
上面代碼中的block實(shí)現(xiàn)了跨越ruby作用域門的作用。實(shí)際上是對(duì)Class類的覆寫,不過(guò)顯得更加ruby way。至于這樣的做有什么大用處,我還沒(méi)想通,還需要在以后的源代碼閱讀中認(rèn)真體會(huì)。
三、 私有方法inherited
class Foo def self.inherited(subclass) puts "New subclass: #{subclass}" end end class Bar < Foo end class Baz < Bar end
上面這段代碼會(huì)產(chǎn)生下面的輸出:
New subclass: Bar
New subclass: Baz
這應(yīng)該也算是ruby元編程的一點(diǎn)點(diǎn)內(nèi)容吧,類似于included,當(dāng)Foo類被繼承的時(shí)候,子類會(huì)自動(dòng)的向這個(gè)私有方法傳遞子類類名并且執(zhí)行該方法內(nèi)的代碼。也應(yīng)該用處。之前在Rails源代碼中遇見(jiàn)過(guò)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。