Метод прохождения Ruby - PullRequest
       30

Метод прохождения Ruby

2 голосов
/ 08 июля 2019

Пытается понять сложность рубина, но пока не имеет смысла.

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 }

1 Ответ

4 голосов
/ 08 июля 2019

times принимает аргумент блока, который отличается от «обычных» аргументов амперсандом. Вы можете передать это явный блок

5.times { |x| puts x }

или вы можете передать значение с помощью &

5.times(&method(:puts))

Различная обработка аргумента блока позволяет нам писать методы, которые выглядят и действуют как встроенные операторы. Например, бесконечный цикл в Ruby можно записать как

loop {
  # fun stuff happening in here
}

Но loop - это метод в базовой библиотеке, а не встроенное ключевое слово. Мы могли бы написать, что loop работают сами. Enumerable и другие модули активно используют блочные аргументы для обеспечения более удобного синтаксиса, что является одной из основных целей Ruby как языка.

...