2

少し前に、次のようなラムダ形式を確実に見たブログ記事を読みました。

arr.map(OtherClass.method *arr_element*)

*arr_element* - 不明な部分。みたいだ

arr.map(&:to_i)

ただし、反復クラス メソッドではありません。

たとえば、素数の配列を確認する必要があります。

require 'prime'

p [1, 11, 13, 18].all? { |y| Prime.prime? y }

この表現のもっと短い形式が必要です。

4

2 に答える 2

10

methodオブジェクトを呼び出してMethodインスタンスを取得し、それを使用&してそれをブロックに変換できます (Method は に応答するためto_proc:

[1, 11, 13, 18].all?(&Prime.method(:prime?))

もちろん、多くの場合、文字数が減るわけではありませんが、これを何度も使用する場合は、変数に格納できます。

is_prime = Prime.method(:prime?)

[1, 11, 13, 18].all?(&is_prime)
[1, 17, 7, 321].all?(&is_prime)
于 2013-11-09T21:02:47.967 に答える
4

あなたが言ったように arr.map(OtherClass.method *arr_element*)

上記を満たす一例を次に示します。

a = %w(foo.rb bar.xml)
a.map(&File.method(:extname)) # equivalent to a.map{|e| File.extname(e) }
# => [".rb", ".xml"]

a.map{|e| File.extname(e) }常に高速なフォームを使用してください。

ベンチマーク

require 'benchmark'

a = %w(foo.rb bar.xml foo.c baz.dll) * 100000

Benchmark.bm(10) do |b|
  b.report("short form")    { a.map(&File.method(:extname)) }
  b.report("usual one") { a.map{|e| File.extname(e) } }
end

出力

                 user     system      total        real
short form   0.600000   0.020000   0.620000 (  0.618438)
usual one    0.340000   0.000000   0.340000 (  0.344993)
于 2013-11-09T21:02:31.340 に答える