给出以下数组a:
a = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我该怎么办:
a.map { |num| num + 1 }
Run Code Online (Sandbox Code Playgroud)
使用简短表示法:
a.map(&:+ 1)
Run Code Online (Sandbox Code Playgroud)
要么:
a.map(&:+ 2)
Run Code Online (Sandbox Code Playgroud)
其中1和2是参数?
And*_*imm 41
在这种情况下,你可以做到
a.map(&1.method(:+))
Run Code Online (Sandbox Code Playgroud)
但只是因为1 + x通常与x + 1相同.
Ser*_*sev 34
你不能这样做.该&操作是打开符号转换成特效.
a = [1, 2, 3, 4, 5]
puts a.map(&:to_s) # prints array of strings
puts a.map(&:to_s2) # error, no such method `to_s2`.
Run Code Online (Sandbox Code Playgroud)
&是一个简写to_proc:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
Run Code Online (Sandbox Code Playgroud)
它创建并返回新的proc.如您所见,您无法将任何参数传递给此方法.您只能调用生成的proc.
tok*_*and 25
你做不到map.但是看看Facets的Enumerable#map_send:
require 'facets'
[1, 2, 3].map_send(:+, 1)
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
编写自己的实现非常简单:
module Enumerable
def map_send(*args)
map { |obj| obj.send(*args) }
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19112 次 |
| 最近记录: |