2012-04-26 103 views
0

下面的「瘋狂性」是否有實際應用?信任剛剛返回的對象?

看起來這是ted總是能夠自己重返世界,人們會認爲他們在談論到ted他們希望採取行動以一定的方式和達到一定年齡誰的方式......但他並不是他描繪自己的方式,而是對某人的年齡撒謊。

什麼「掛羊頭賣狗肉」是可能的,當返回一個對象,你檢查什麼對象代表並能......但是真的那麼對象是行使職權的其他方式能夠其它的東西,然後返回。

class Person 

    def age 
    21 
    end 

    def who_am_i? 
    puts "I am #{self}/#{object_id} and I am #{age} years old" 
    self 
    end 
end 


ted = Person.new 

def ted.singleton_who_am_i?  

    class << self 
     def age 
     0 
     end 
    end 

    puts "I am #{self}/#{object_id} and I am #{age} years old" 
    self 
end 

puts ted.who_am_i? == ted.singleton_who_am_i? 



>> I am #<Person:0x100138340>/2148123040 and I am 21 years old 
>> I am #<Person:0x100138340>/2148123040 and I am 0 years old 
>> true 

回答

0

http://andrzejonsoftware.blogspot.ca/2011/02/dci-and-rails.html

在DCI

,你的數據模型獲取基於它用它的上下文不同類型的行爲。通常它是用object.extend完成的,但它幾乎就是你上面正在做的 - 利用元類。

另一個例子(也可能是爲什麼事情工作的方式)是班紅寶石的工作方式。如果你說

class Foo 
end 

是同樣的事情說

Foo = Class.new 
end 

這意味着你正在做的是在恆定分配Class類的新實例。當你在這個類上定義一個方法時,你不希望它應用到類的所有實例上,你只希望它在你定義的類上。所以,當你說

class Foo 
    def self.bar 
    end 
end 

它是完全相同的事情的話

class Foo 
end 

def Foo.bar 
end 

而這正是因爲你在談論你的問題相同的主要

(抱歉,如果說不清楚)

0

Ruby是一個非常有活力的語言,讓你在運行時將代碼注入對象。它有一些很好的用途,但它也可能使代碼非常難以調試和理解。

這是完全反直覺的,查詢的對象來修改對象的方法。沒有人會希望調用who_am_i來修改對象。

在另一方面更換方法,比如,可以使單元測試類真的直線前進。

如果你想測試類不同年齡您可以在測試之前,注入這樣的代碼的行爲。

相關問題