Синтаксис для помещения блока в одну строку

Итак, у меня есть такой метод Ruby:

def something(variable, &block)
  ....
end

И я хочу назвать это так:

something 'hello' { do_it }

За исключением того, что у меня это не работает, я получаю синтаксическую ошибку. Если я сделаю это вместо этого, это сработает:

something 'hello' do
  do_it
end

За исключением того, что мне не хватает того красивого вида, когда он находится в одной строке.

Я могу понять, почему это происходит, поскольку может показаться, что это хэш, переданный как вторая переменная, но без запятой между переменными ... но я предполагаю, что должен быть способ справиться с этим, что я ' м отсутствует. Здесь?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
30
0
11 670
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы хотите, чтобы "def something" принял блок, вам нужно передать данные этому блоку. Например:

#to uppercase string
def something(my_input)
 yield my_input.upcase
end

# => "HELLO WORLD"
something("hello world") { |i| puts i}

Это не обязательно правда. Вы можете ничего не дать, передать блок другому методу или проигнорировать его. Нет особой необходимости отдавать что-либо блоку. Как был написан метод в исходном вопросе, блок passwd будет преобразован в Proc с именем block.

Grant Hutchins 01.11.2008 21:28
Ответ принят как подходящий

Вы должны заключить свой аргумент в скобки:

something('hello') { do_it }

Это должно сработать.

да, вот и все !! Спасибо. Иногда вы упускаете самые очевидные вещи ;-)

Cameron Booth 01.11.2008 20:28

@ Кэмерон Бут: Может, ты сможешь принять его ответ? :)

Pistos 02.11.2008 08:47

Если у вас нет параметров, я полагаю, вам все равно нужно поставить явную круглую скобку, иначе вместо этого он передаст блок в качестве параметра? то есть: something() { do_it }

CTS_AE 06.08.2019 02:43

Есть идеи, когда это изменилось? something 'hello' { do_it } отлично работал в Ruby 2.3.7 - он везде в нашем контроллере before_actions

tgf 28.01.2020 01:43

А как насчет:

>> def something(arg1 , &block)
>>   yield block
>> end
=> nil
>> def do_it
>>   puts "Doing it!"
>> end
=> nil
>> something('hello') { do_it }
"Doing it!"
=> nil

Другие вопросы по теме