Possible Duplicate:
Sh或ter way to pass every element of an array to a function

我知道这会奏效:

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

但在Python中,我只需要写:

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

[inc(x) f或 x in [1,2,3])

我想知道我是否可以跳过在Ruby中制作块的步骤,我做到了:

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

有人知道怎么做吗?

推荐答案

根据"Passing Methods like Blocks in 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会将该符号解释为实例方法名,并try 在该对象上调用该方法.


在Python中可以将函数名作为一级对象传递,而在Ruby中则不能,这是因为Ruby允许调用一个没有括号的零参数方法.Python的语法需要括号,因此可以防止传入函数名和调用不带参数的函数之间出现任何可能的歧义.

Ruby相关问答推荐

Ruby;人;docs-使用\";?

根据部分已知值判断数组内容的简洁 Rubyist 方法是什么?

每次调用返回新的 REST 响应的 Ruby Rspec class_double

当 node 名称是/包含整数时,使用 Nokogiri 解析非 XML 文档

有没有办法向用户返回 nil 消息但不中断 ruby​​ 中的应用程序?

ruby:rubocop 抱怨将 if else 转换为 case 语句

当没有传入块时,是否有更好的方法来防止屈服?

以编程方式获得完整的 Ruby 版本?

ruby:对两个或多个数组的对应成员求和

如果浮点组件不是 .00 sprintf/printf,则仅显示小数点

Ruby 中的 Fail vs. raise:我们真的应该相信风格指南吗?

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

Ruby 中的p是什么?

Ruby 中的抽象方法

Ruby中的常量或类变量?

Ruby 设计模式:如何制作可扩展的工厂类?

将哈希转换为 struct

在 ruby​​ 的超类中调用另一个方法

*nix 是什么意思?

查找与给定条件匹配的元素的索引