0

contents_support?このArrayクラスのメソッドでのinjectの使用を理解しようとしています。&オペレーターの目的は何ですか/それはどのように機能していますか?ビット単位の演算子だと思います。&私はこの演算子の説明を見つけました:

おそらく、二項&演算子の最も簡単な使用法は、Arrayクラスです。&はset-intersection演算子です。これは、結果が両方の配列の共通要素のコレクションであることを意味します。

irb(main):001:0> [1,2,3] & [1,2,5,6]
=> [1, 2]

しかし、この場合、これは、オブジェクトの一部(つまりローカル変数)が送信されたメッセージに応答しない可能性がある場所trueへの引数として渡されることを意味します。何が返ってくるのか、なぜ必要なのか説明していただけますか?上記のコードスニペットは、以下のコードで考える適切な方法を説明していますか?injectitemscontents_support?&&&

class Array
   def contents_support?(message)      
      self.inject(true) { |all_ok, item| all_ok = all_ok & item.respond_to?(message) }       
   end

   def thunk(message, *args)
      if contents_support?(message)
        self.each { |item| args.empty? ? item.send(message) : item.send(message, args) }
      else
        raise "Not all contents of #{self.inspect} respond to method #{message}"       
      end   
   end
end
4

2 に答える 2

3

ティンクトリアスが言わなかったこと。
あなたのケースでは、の使用法は&関係ありません&&。実際にはパフォーマンスが向上していたでしょう。

a & b

a AND を実行bし、それらを組み合わせた結果を返します。

a && b # equals if a
       #          return b
       #        else
       #          return a
       #        end

つまり、 false の場合は実行されませんba。あなたの場合、falseかitem.respond_to?(message)どうかを確認する必要はありません。all_ok

ところで、contents_support?(message)を使用してより簡単に記述できた可能性がありますall?

def contents_support?(message)
  self.all? { |item| item.respond_to?(message) }       
end

そして、あなたが尋ねたのでcontents_support?(message)、配列のすべてのアイテムがmessage属性またはメソッドである可能性があるかどうかをテストします。元:[1, 2, 3].contents_support?(:next) #=> true

于 2013-01-04T00:34:32.507 に答える
0

Ruby のほとんどの演算子と同様に、&オーバーロードされています。その動作は引数の型に依存します。

  • 最初のスニペットでは、両側のオブジェクト&Arrays. その場合、&は集合の交差のようなものです: のArray両方の引数で見つかった場合、結果の には要素のみが含まれます&
  • 2 番目のスニペットでは、左側がブール値です。明らかに、これは.respond_to?ブール値を返さなければならないことを意味します (名前の末尾にある疑問符はヒントです)。ブール値の場合、&は論理積です。両側がtrueである場合、結果はtrueであり、そうでない場合はfalseです。
于 2013-01-04T00:12:48.967 に答える