Rubyの世界の初心者、私は次のようなことをしたいと思います:
[1,2.0,"a",2].select(&:is_a?(Integer))
しかし、このようにそれは絶対にうまくいきません...
何か案は?
Rubyの世界の初心者、私は次のようなことをしたいと思います:
[1,2.0,"a",2].select(&:is_a?(Integer))
しかし、このようにそれは絶対にうまくいきません...
何か案は?
&
構文を使用するときは、パラメーターを取らないメソッドを使用する必要があるため、求めていることを実行できません。
ただし、何らかの理由で本当にそのようなことをしたい場合は、次のようにパラメーターを取らないメソッドを作成する必要があります。
class Object
def is_an_integer?
is_a? Integer
end
end
その後、次のことができます。
[1,2.0,"a",2].select(&:is_an_integer)
&: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)
驚くほどきれいではないかもしれませんが、うまくいきます。