65

可能重复:
将数组的每个元素传递给函数的更短方法

我知道这会起作用:

def inc(a)
  a+1
end
[1,2,3].map{|a| inc a}

但在 Python 中,我只需要编写:

map(inc, [1,2,3])

或者

[inc(x) for x in [1,2,3])

我想知道是否可以跳过在 Ruby 中创建块的步骤,然后这样做:

[1,2,3].map inc
# => ArgumentError: wrong number of arguments (0 for 1)
# from (irb):19:in `inc'

有没有人知道如何做到这一点?

4

3 回答 3

94

根据“像Ruby中的块一样传递方法”,您可以像这样将方法作为块传递:

p [1,2,3].map(&method(:inc))

老实说,不知道这是否比自己滚动块好得多。

如果您的方法是在您正在使用的对象的类上定义的,您可以这样做:

# 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)

在这种情况下,Ruby 会将符号解释为实例方法名称并尝试调用该对象上的方法。


您可以在 Python 中将函数名称作为一等对象传递,但在 Ruby 中不能传递的原因是因为 Ruby 允许您调用零参数且不带括号的方法。Python 的语法,因为它需要括号,所以可以防止在传入函数名和调用不带参数的函数之间出现任何可能的歧义。

于 2012-12-19T04:38:28.340 回答
11

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

4.next
#=> 5

[1,2,3].map(&:next)
#=> [2, 3, 4]
于 2012-12-19T05:03:22.290 回答
-15
def inc(a)
  a + 1 
end

p [1,2,3].map{|a| inc a}
于 2012-12-19T04:31:30.097 回答