Проблема с правильными правилами синтаксиса 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
)
Где вы делаете это совершенно ясно, кто что делает.