我刚才偶然发现 - 如何轻松将传递给一个方法的类的真实性限制为只有一个类类型?恩。代码:
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
方法,我该怎么做?
答案 0 :(得分:4)
class Gets
def self.read(s)
raise ArgumentError unless s.kind_of?(S)
s.s
end
end
答案 1 :(得分: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