新聞中心
從模塊引入方法、變量,使得編程變得簡(jiǎn)單,擴(kuò)展性愈強(qiáng),比以往的類(lèi)的繼承更靈活。這樣的引入,仿佛將一個(gè)方法塊,復(fù)制了一份放到了你所引用的類(lèi)或者模塊里面。你完全可以將多個(gè)互不相干的類(lèi)中相同的方法拿出來(lái)寫(xiě)到一個(gè)模塊中,這樣可以使得代碼精簡(jiǎn),符合Ruby的設(shè)計(jì)初衷,而且,使得你的程序更有條理。

Ruby on Rails常見(jiàn)用法
通常引用模塊有以下3種情況:
1.在類(lèi)定義中引入模塊,使模塊中的方法成為類(lèi)的實(shí)例方法
這種情況是最常見(jiàn)的
直接 include 即可
2.在類(lèi)定義中引入模塊,使模塊中的方法成為類(lèi)的類(lèi)方法
這種情況也是比較常見(jiàn)的
直接 extend 即可
3.在類(lèi)定義中引入模塊,既希望引入實(shí)例方法,也希望引入類(lèi)方法
這個(gè)時(shí)候需要使用 include,
但是在模塊中對(duì)類(lèi)方法的定義有不同,定義出現(xiàn)在self.included塊中
def self.included(c) ... end 中
Ruby on Rails實(shí)例講解
Code
- #基類(lèi)
- module Base
- #顯示
- def show
- puts "You came here!"
- end
- end
- class Car
- extend Base #擴(kuò)展了類(lèi)方法,我們可以通過(guò)Car.show調(diào)用
- end
- class Bus
- include Base #擴(kuò)展了實(shí)例方法,可以通過(guò)Bus.new.show調(diào)用
- end
但是我們經(jīng)常有這樣的需要,希望基類(lèi)足夠強(qiáng)大,既可以擴(kuò)展實(shí)例方法,也可以擴(kuò)展類(lèi)方法,Ruby on Rails同樣提供了解決方案。
- Code
- #基類(lèi)
- module Base
- def show
- puts "You came here!"
- end
- #擴(kuò)展類(lèi)方法
- def self.included(base)
- def base.call
- puts "I'm strong!"
- end
- base.extend(ClassMethods)
- end
- #類(lèi)方法
- module ClassMethods
- def hello
- puts "Hello baby!"
- end
- end
- end
- class Bus
- include Base
- end
此時(shí)Bus已經(jīng)具備了實(shí)例方法show,類(lèi)方法:call 、hello,訪問(wèn)方式
- Bus.new.show
- Bus.call
- Bus.hello
肯定也有人提出此類(lèi)疑問(wèn),使用extend能夠?qū)崿F(xiàn)此功能不?
答案是:暫未找到,如您找到請(qǐng)明示,多謝!
我也曾經(jīng)做過(guò)以下實(shí)驗(yàn),結(jié)果沒(méi)有成功,在此也張貼出來(lái),希望能給您帶來(lái)一些啟示。
- Code
- #基類(lèi)
- module Base
- def show
- puts "You came here!"
- end
- #擴(kuò)展實(shí)例方法
- def self.extended(base)
- base.extend(InstanceMethods)
- end
- module InstanceMethods
- def love
- puts 'We are instances,loving each other!'
- end
- end
- end
- class Car
- extend Base
- end
但是這樣,實(shí)例方法擴(kuò)展失敗,依然擴(kuò)展了類(lèi)方法
- Car.show
- Car.love #類(lèi)方法
- Car.new.love #undefined method 'love'
【編輯推薦】
- Ruby語(yǔ)言的發(fā)展趨勢(shì)和啟示
- Ruby on Rails為企業(yè)SOA做好準(zhǔn)備了嗎
- 腳本語(yǔ)言排行榜 PHP、Ruby和Python領(lǐng)先
- 讓Ruby性能增加30%的改進(jìn)方法分析
- 對(duì)Ruby VS Java誤區(qū)的深度剖析
文章題目:淺談Ruby on Rails中的include和extend
URL標(biāo)題:http://www.5511xx.com/article/cdpceij.html


咨詢(xún)
建站咨詢(xún)
