2

Rubyの世界の初心者、私は次のようなことをしたいと思います:

[1,2.0,"a",2].select(&:is_a?(Integer))

しかし、このようにそれは絶対にうまくいきません...

何か案は?

4

2 に答える 2

2

&構文を使用するときは、パラメーターを取らないメソッドを使用する必要があるため、求めていることを実行できません。

ただし、何らかの理由で本当にそのようなことをしたい場合は、次のようにパラメーターを取らないメソッドを作成する必要があります。

class Object
  def is_an_integer?
   is_a? Integer
  end
end

その後、次のことができます。

[1,2.0,"a",2].select(&:is_an_integer)
于 2013-07-13T17:32:43.417 に答える
1

&:method_nameのシンタックス シュガーです&:method.to_proc。列挙子likeselectおよび whatnot はブロックを受け入れ、列挙子の各要素を渡されたブロックに譲ります。あれは:

[1,2,3].select &:even?

次と同等です。

p = :even.to_proc
[1,2,3].select {|val| p.yield(val) }

列挙子によって生成されたパラメーターのみが proc に生成されるため、それらをソース リストに含める必要があります。つまり、次のことが期待できます。

[[1, Integer]].select &:is_a?

結果として:

select {|*args|, p.yield(*args) }

ただし、pこれは特定のクラスにバインドされたメソッドではないことに注意してください。渡された引数で指定されたメソッドを呼び出そうとします。Array#is_a?したがって、引数を分割して呼び出すのではなく、引数なしで呼び出そうとしInteger#is_a?(Integer)ます。

したがって、これを達成するには、渡された引数をバインドする proc を何らかの方法で作成し、渡された引数を使用して、yield レシーバーで指定されたメソッドを呼び出す必要があります。これを行うには、Symbol クラスにメソッドを追加します。

  class Symbol
    def with_args(*args)
      proc {|receiver| receiver.send(self, *args) }
    end
  end

  [1, "a"].select &:is_a?.with_args(Integer)

驚くほどきれいではないかもしれませんが、うまくいきます。

于 2013-07-13T17:40:45.583 に答える