Итак, у меня есть такой метод Ruby:
def something(variable, &block)
....
end
И я хочу назвать это так:
something 'hello' { do_it }
За исключением того, что у меня это не работает, я получаю синтаксическую ошибку. Если я сделаю это вместо этого, это сработает:
something 'hello' do
do_it
end
За исключением того, что мне не хватает того красивого вида, когда он находится в одной строке.
Я могу понять, почему это происходит, поскольку может показаться, что это хэш, переданный как вторая переменная, но без запятой между переменными ... но я предполагаю, что должен быть способ справиться с этим, что я ' м отсутствует. Здесь?

Если вы хотите, чтобы "def something" принял блок, вам нужно передать данные этому блоку. Например:
#to uppercase string
def something(my_input)
yield my_input.upcase
end
# => "HELLO WORLD"
something("hello world") { |i| puts i}
Вы должны заключить свой аргумент в скобки:
something('hello') { do_it }
Это должно сработать.
да, вот и все !! Спасибо. Иногда вы упускаете самые очевидные вещи ;-)
@ Кэмерон Бут: Может, ты сможешь принять его ответ? :)
Если у вас нет параметров, я полагаю, вам все равно нужно поставить явную круглую скобку, иначе вместо этого он передаст блок в качестве параметра? то есть: something() { do_it }
Есть идеи, когда это изменилось? something 'hello' { do_it } отлично работал в Ruby 2.3.7 - он везде в нашем контроллере before_actions
А как насчет:
>> def something(arg1 , &block)
>> yield block
>> end
=> nil
>> def do_it
>> puts "Doing it!"
>> end
=> nil
>> something('hello') { do_it }
"Doing it!"
=> nil
Это не обязательно правда. Вы можете ничего не дать, передать блок другому методу или проигнорировать его. Нет особой необходимости отдавать что-либо блоку. Как был написан метод в исходном вопросе, блок passwd будет преобразован в
Procс именемblock.