传递给方法的Ruby限制类的类型?

时间:2013-04-24 09:37:47

标签: ruby-on-rails 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方法,我该怎么做?

2 个答案:

答案 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