如何传递函数而不是块

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的语法,因为它需要括号,防止传递函数名和调用没有参数的函数之间的任何可能的歧义.

  • `将Ruby解释符号作为一个实例方法名,并试图调用该方法对object.` =>您的实例方法的一提的是不正确的,或者至少是不够清晰.`&`如果它是Proc,它将附加的内容转换为块.如果它不是Proc,那么它应用`to_proc`,在这种情况下`Symbol#to_proc`. (4认同)
  • 请修复链接 (2认同)

old*_*god 10

不回答你的问题,但如果你真的只想增加所有的变量,你就有了 Integer#next

4.next
#=> 5

[1,2,3].map(&:next)
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)