2

前段时间,我读了一篇博客文章,其中我确实看到了 lambda 形式,如:

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 回答