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 作为一种语言的主要目标之一。
试图理解 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 作为一种语言的主要目标之一。