前段时间,我读了一篇博客文章,其中我肯定看到了lambda形式:
arr.map(OtherClass.method *arr_element*)
Run Code Online (Sandbox Code Playgroud)
其中*arr_element* - 未知部分.就像是
arr.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)
但不适用于迭代类方法.
例如,我需要检查Prime数字的数组:
require 'prime'
p [1, 11, 13, 18].all? { |y| Prime.prime? y }
Run Code Online (Sandbox Code Playgroud)
我需要更多这种表达的简短形式.
您可以调用method一个对象来获取一个Method实例,然后使用&它将其转换为一个块(因为Method响应to_proc:
[1, 11, 13, 18].all?(&Prime.method(:prime?))
Run Code Online (Sandbox Code Playgroud)
当然,在许多情况下,这可能不是更少的字符,但如果你多次使用它,你可以将它存储在一个变量中:
is_prime = Prime.method(:prime?)
[1, 11, 13, 18].all?(&is_prime)
[1, 17, 7, 321].all?(&is_prime)
Run Code Online (Sandbox Code Playgroud)
正如你所说的 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"]
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
输出
user system total real
short form 0.600000 0.020000 0.620000 ( 0.618438)
usual one 0.340000 0.000000 0.340000 ( 0.344993)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |