0

オブジェクトが任意の数のメソッドに応答するかどうかを確認する必要があります。

そして、私はこれを行うのにうんざりしています:

if a.respond_to?(:foo) && a.respond_to?(:bar) && a.respond_to?(:blah)

これを行うためのより「正しい」DRY方法は何でしょうか?

4

4 に答える 4

3

いつでもヘルパー メソッドでラップできます。

def has_methods?(obj, *methods)
   methods.all?{|method| obj.respond_to? method}
end
于 2012-11-30T23:05:06.760 に答える
2

モンキーパッチに抵抗がない場合は、これを試してください。

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タイプミスを修正。

于 2012-11-30T23:07:22.750 に答える
0

Active Supportから拡張子を確認してくださいRails。メソッドtryがあります。コンテキストが不足しているため、このメソッドをどのように使用できるかを言うのは難しいです。おそらく次のようなものです。

if a.try(:foo) && a.try(:bar) && a.try(:blah)

この方法を使用するには、

require 'active_support/core_ext/object/try.rb'

また、このメソッドの私のバージョンを確認してください:

于 2012-11-30T23:04:33.753 に答える
0

「正しい」方法 (またはとにかく多くの方法の 1 つ) は、Tell Don't Ask です。つまり、オブジェクトにメッセージを送信している場合、文句を言わずに応答することを期待します。これは、ダック タイピングとも呼ばれます (鳴くことができれば、それはアヒルです)。

具体的な質問がなかったので、具体的なアドバイスはできません。3 つの異なるメソッドをテストしている場合、オブジェクトの種類がわからないように見えますaが、これは興味深いケースです。もっとコードを投稿してください!

于 2012-11-30T23:04:53.277 に答える