0

私が今つまずいたこと - 1 つのメソッドに渡されるクラスの真偽を 1 つのクラス タイプのみに簡単に制限する方法は? 元。コード:

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メソッドに渡されることを確認したいのですが、どうすればそれを行うことができますか?

4

2 に答える 2

4

一方、 sawaのソリューションは間違いなく有効であり、まさにあなたが望むことを行います. ruby のような動的言語では、実際にはダック タイピングを使用する方が一般的です。

アイデアは、属性がどのメッセージに応答する必要があるかをアサートすることです。これにより、たとえば別の実装を簡単に渡すことができます。

class Gets
  def self.read(obj)
    raise ArgumentError, "must implement #s" unless obj.respond_to?(:s)
    obj.s
  end
end
于 2013-04-24T09:56:08.907 に答える
4
class Gets
  def self.read(s)
    raise ArgumentError unless s.kind_of?(S)
    s.s
  end
end
于 2013-04-24T09:51:28.987 に答える