Я предпочитаю использовать функции стрелок во все времена, когда не требуется доступ к локальному this
, потому что функция стрелки не связывает свои собственные, аргументы, супер или new.target .
Почему это происходит?
blockquote>Поскольку {} и do / end имеют разный приоритет. {} является «более сильным». Как в «связано с ближайшим вызовом метода». Таким образом, этот
p foo { something }
виден следующим образом.
p (foo { something })
И do / end выглядит так
p(foo) do something end
Нет ошибки, просто пропустите часть кода
blockquote>Да, из-за другой функции рубина. Что означает «вы можете передать блок методу ЛЮБОЙ, а затем этот метод должен использовать или игнорировать его». Здесь
p
не ожидает блока и просто игнорирует его.
Ruby обычно дает вам два способа выразить одно и то же. block
ассоциируется с вызовом p
, а не с вызовом gsub
.
Приоритет оператора.
Проблема с правильными правилами синтаксиса 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
)
Где вы делаете это совершенно ясно, кто что делает.