Ruby 传递方法

Ruby passing method

试图理解 ruby 的复杂性,但到目前为止没有任何意义。

5.times(method(:puts))

给出错误,这没有多大意义。我有某种语法错误还是无法在 ruby 中执行?

ArgumentError: wrong number of arguments (given 1, expected 0)
        from (irb):78:in `times'

我正在尝试做类似于

的事情
[0, 1, 2, 3, 4].forEach(console.log)

java.util.stream.IntStream.range(0, 5).forEach(System.out::println);

同时这些确实有效:

method(:puts).call(1)
# and
5.times { |i| puts i }

times 接受一个块参数,它通过一个符号与 "regular" 参数区分开来。您可以将它传递给显式块

5.times { |x| puts x }

或者您可以通过 &

向其传递一个值
5.times(&method(:puts))

以不同方式处理块参数允许我们编写看起来和行为很像 built-in 语句的方法。例如,Ruby 中的无限循环可以写成

loop {
  # fun stuff happening in here
}

但是loop是核心库中的方法,不是built-in关键字。我们可以自己编写 loop 函数。 Enumerable 和其他模块大量使用块参数来提供更友好的语法,这是 Ruby 作为一种语言的主要目标之一。