почему ruby выдает синтаксическую ошибку при попытке выхода в блоке? - PullRequest
0 голосов
/ 29 января 2020

Я изучал доходность ключевых слов и их использование в ruby. Хотя вполне возможно передать блок методу неявно и вызвать его через yield, при попытке передать другой блок в полученный блок:

def test
  yield { p 'yield2' }
end

test { |&b| p 'in yield1'; b.call }

ruby жалуется на синтаксическую ошибку:

yield.rb:5: syntax error, unexpected '}', expecting keyword_end
  yield { p 'yield2' }
                     ^

Почему эта разница обрабатывается с выходом и почему это рассматривается как синтаксическая ошибка?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вот очищенная версия:

def test
  x = -> { p 'l1' }

  yield -> { p 'yield2' }
end

Обратите внимание, что yield - это ключевое слово, а не вызов метода, поэтому вам нужно быть более явным. Вы не можете просто поставить блок туда и вызвать его, он должен быть правильным lambda.

Тогда при вызове вы не можете разбить блок, это просто обычный аргумент :

test {|b| p 'in yield1'; b.call }

Теперь это работает.

0 голосов
/ 29 января 2020

Вы не можете передать аргумент блока yield, Ruby просто не позволяет этого.

Вместо этого вы можете использовать явный аргумент блока и передать блок call:

def test(&block)
  block.call { p 'yield2' }
end

test { |&b| p 'in yield1'; b.call }
# "in yield1"
# "yield2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...