Различное поведение Ruby зависит от типа блока

Я предпочитаю использовать функции стрелок во все времена, когда не требуется доступ к локальному this, потому что функция стрелки не связывает свои собственные, аргументы, супер или new.target .

1
задан Dmitry Dmitriev 13 July 2018 в 19:27
поделиться

3 ответа

Почему это происходит?

Поскольку {} и do / end имеют разный приоритет. {} является «более сильным». Как в «связано с ближайшим вызовом метода». Таким образом, этот

p foo {
  something
}

виден следующим образом.

p (foo {
  something
})

И do / end выглядит так

p(foo) do
  something
end

Нет ошибки, просто пропустите часть кода

Да, из-за другой функции рубина. Что означает «вы можете передать блок методу ЛЮБОЙ, а затем этот метод должен использовать или игнорировать его». Здесь p не ожидает блока и просто игнорирует его.

5
ответ дан Sergio Tulentsev 17 August 2018 в 12:11
поделиться

Ruby обычно дает вам два способа выразить одно и то же. block ассоциируется с вызовом p, а не с вызовом gsub.

Приоритет оператора.

2
ответ дан Sam 17 August 2018 в 12:11
поделиться

Проблема с правильными правилами синтаксиса Ruby заключается в том, что иногда он сбивается с толку о том, кому принадлежит блок. Из-за двусмысленности оба p и gsub могут «владеть» этим блоком. Метод do присваивается p, а подход { ... } привязан к gsub.

Это, вероятно, связано с некоторым типом правила приоритета оператора, хотя, поскольку блок не является оператором per se, я не уверен, что могу найти ссылку на это конкретное поведение прямо сейчас.

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

rv = "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) do
  "two" + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
end

p rv

Здесь rv = не может взять блок, чтобы он не смог захватить его непреднамеренно.

Вы также можете сделать это:

p(
  "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) do
    "two" + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
  end
)

Где вы делаете это совершенно ясно, кто что делает.

2
ответ дан tadman 17 August 2018 в 12:11
поделиться
  • 1
    Да, прибегая к назначению, иногда просто ненужное обручем, чтобы проскочить, когда я украшаю код отладочной печатью. Столбцы: / – Sergio Tulentsev 13 July 2018 в 19:33
Другие вопросы по тегам:

Похожие вопросы: