на поверхности,
Ruby очень похож на другие объектно-ориентированные языки, такие как Java, Php, C и т. Д.
но все становится немного странно, когда мы начинаем сталкиваться с блоками.
например, это работает
(0...8).max()
=> 7
но это не
(0...8).map(puts "hello world")
hello world
ArgumentError: wrong number of arguments(1 for 0)
Очевидно, что метод map не принимает аргументы, а принимает блоки, поэтому передача вместо 1011 * на {}
исправляет ошибку.
(0...8).map{puts "hello world"}
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
=> [nil, nil, nil, nil, nil, nil, nil, nil]
И затем, есть некоторые методы, которые должны принимать оба - блоки и аргументы
8.downto(1){puts "hello world"}
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
=> 8
Проблема, с которой я столкнулся, заключается в путанице, если я должен использовать ()
, {}
или оба в данном методе. На основании чего принимается решение?
- Исправлено ли это для каждого метода, и я просто должен помнить, что метод принимает (блоки или параметры)?
- Или есть какие-то другие логические рассуждения, на основании которых принимается решение, если метод принимает блоки
{}
или параметры ()
?
Пожалуйста, помогите мне понять