2013-04-24 25 views
0

我現在偶然發現了 - 如何容易限制傳遞給一個方法的類的真實性只有一個類的類型?恩。代碼:傳遞給方法的類的Ruby限制類型?

class S 
    attr_reader :s 
    def initialize(s = nil) 
    @s = s || 14 
    end 
end 

class Gets 
    def self.read(s) 
    s.s 
    end 

end 

s=S.new 
p Gets.read(s) # 14 

比方說,S級擁有更復雜的結構,我想,以確保只有類可以被傳遞給Gets#read方法,我該怎麼辦呢?

+1

Check the class?但是目的是什麼?這限制了你如何使用該方法。國際海事組織最多檢查它是否實施你真正關心的,它的界面。 – 2013-04-24 09:47:15

回答

4

雖然到sawa解決方案肯定是有效的,不正是你想要的東西。在像Ruby這樣的動態語言中,使用duck typing實際上更常見。

這個想法只是斷言屬性必須響應哪些消息。這允許容易地通過例如一個不同的實現。

class Gets 
    def self.read(obj) 
    raise ArgumentError, "must implement #s" unless obj.respond_to?(:s) 
    obj.s 
    end 
end 
+1

實際上,這是Ruby社區稱之爲「雞打字」的原因,因爲你害怕有人通過錯誤的對象。 – 2013-04-24 10:16:58

4
class Gets 
    def self.read(s) 
    raise ArgumentError unless s.kind_of?(S) 
    s.s 
    end 
end 
相關問題