オブジェクトが任意の数のメソッドに応答するかどうかを確認する必要があります。
そして、私はこれを行うのにうんざりしています:
if a.respond_to?(:foo) && a.respond_to?(:bar) && a.respond_to?(:blah)
これを行うためのより「正しい」DRY方法は何でしょうか?
いつでもヘルパー メソッドでラップできます。
def has_methods?(obj, *methods)
methods.all?{|method| obj.respond_to? method}
end
モンキーパッチに抵抗がない場合は、これを試してください。
class Object
def respond_to_all? *meths
meths.all? { |m| self.respond_to?(m) }
end
def respond_to_any? *meths
meths.any? { |m| self.respond_to?(m) }
end
end
p 'a'.respond_to_all? :upcase, :downcase, :capitalize
#=> true
p 'a'.respond_to_all? :upcase, :downcase, :blah
#=> false
p 'a'.respond_to_any? :upcase, :downcase, :blah
#=> true
p 'a'.respond_to_any? :upcaze, :downcaze, :blah
#=> false
更新:とを使用meths.all?
しmeths.any?
ます。@MarkThomas、私の心をリフレッシュしてくれてありがとう。
更新:responsd
タイプミスを修正。
「正しい」方法 (またはとにかく多くの方法の 1 つ) は、Tell Don't Ask です。つまり、オブジェクトにメッセージを送信している場合、文句を言わずに応答することを期待します。これは、ダック タイピングとも呼ばれます (鳴くことができれば、それはアヒルです)。
具体的な質問がなかったので、具体的なアドバイスはできません。3 つの異なるメソッドをテストしている場合、オブジェクトの種類がわからないように見えますa
が、これは興味深いケースです。もっとコードを投稿してください!