Han*_*Sun 50 ruby functional-programming
可能重复:
将数组的每个元素传递给函数的更短方式
我知道这会奏效:
def inc(a)
a+1
end
[1,2,3].map{|a| inc a}
Run Code Online (Sandbox Code Playgroud)
但在Python中,我只需要写:
map(inc, [1,2,3])
Run Code Online (Sandbox Code Playgroud)
要么
[inc(x) for x in [1,2,3])
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以跳过在Ruby中创建块的步骤,并且这样做:
[1,2,3].map inc
# => ArgumentError: wrong number of arguments (0 for 1)
# from (irb):19:in `inc'
Run Code Online (Sandbox Code Playgroud)
有没有人有关于如何做到这一点的想法?
Pla*_*ure 78
根据" 像Ruby中的块一样传递方法 ",您可以将方法作为块传递,如下所示:
p [1,2,3].map(&method(:inc))
Run Code Online (Sandbox Code Playgroud)
老实说,不知道这是否比滚动自己的块要好得多.
如果您的方法是在您正在使用的对象的类上定义的,则可以执行以下操作:
# Adding inc to the Integer class in order to relate to the original post.
class Integer
def inc
self + 1
end
end
p [1,2,3].map(&:inc)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Ruby会将符号解释为实例方法名称,并尝试在该对象上调用该方法.
您可以在Python中将函数名称作为第一类对象传递但不在Ruby中传递的原因是因为Ruby允许您在没有括号的情况下调用零参数的方法.Python的语法,因为它需要括号,防止传递函数名和调用没有参数的函数之间的任何可能的歧义.
old*_*god 10
不回答你的问题,但如果你真的只想增加所有的变量,你就有了 Integer#next
4.next
#=> 5
[1,2,3].map(&:next)
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)