跳到主要內容

發表文章

目前顯示的是有「Visitor Pattern」標籤的文章

Ruby: class << self

Ruby: class << self 我們先不管class << self是什麼意思,我們先來看看動態語言有哪些有趣的用法。 Ruby可以動態的在class裡面新增,修改一些方法。譬如: class Foo def foo return 'Hello Foo' end end f = Foo.new puts f.foo # Hello Foo class Foo def foo return 'Edit Foo' end end puts f.foo # Edit Foo 有玩過RPG Maker的人應該很熟練了,RPG Maker的模組都是這樣掛上去的,直接把模組複製到整個Script的最後面,將系統原先的方法override掉(這邊我講override其實有點問題,因為override比較適合用在編譯時期,子類別繼承並修改父類別的方法,但這裡單純只是修改類別原先的方法) 好的,那如果我產生兩個Foo物件,延續上例的類別 class Foo def foo return 'Hello Foo' end end f1 = Foo.new f2 = Foo.new puts f1.foo # Hello Foo puts f2.foo # Hello Foo class Foo def foo return 'Edit Foo' end end puts f1.foo # Edit Foo puts f2.foo # Edit Foo 因為是直接對類別做修改,所以上例中,f1與f2的行為都會改變。 那如果我們今天想要做出像Javascript那種功能,只對單一物件新增或修改方法,有辦法做到嗎?譬如Javascript可以這麼做: function Foo(){ } Foo.prototype.foo = function(){ return "Hello foo"; } var f1 = new Foo(); var f2 = new Foo(); console.log( f1.foo() ); // Hello foo console....