2

试图理解 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 }
4

1 回答 1

4

times接受一个块参数,它通过一个&符号与“常规”参数区分开来。您可以将其传递给显式块

5.times { |x| puts x }

或者你可以通过它传递一个值&

5.times(&method(:puts))

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

loop {
  # fun stuff happening in here
}

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

于 2019-07-08T20:27:51.660 回答