美好的一天。 我对同一 block 代码有不同的行为取决于 block 语法花括号或 do/end 的类型。刚刚跳过带有 do/end 的 block ,没有任何错误通知:
大括号 block 只是工具和p
版画 one Ruby is a COOL language!
:
p "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) {
"one " + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
}
刚刚跳过了 do/end 中的“相同”代码片段,并且 p
告诉我 Enumerator
<Enumerator: "rubyisacoollanguage":gsub(/(ruby)(is)(a)(cool)(language)/)>
:
p "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) do
"two " + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
end
我认为它的发生是因为 p
在第二种情况下,它消除了障碍。当我添加 p
时,事情变得清晰起来 block 内。来自第一个 block 的数据打印了 2 次,而来自第二个 block 的数据根本没有打印。
p "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) {
p "one " + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
}
p "rubyisacoollanguage".gsub(/(ruby)(is)(a)(cool)(language)/) do
p "two " + $1.capitalize + " %s %s %s %s!" % [$2,$3,$4.upcase,$5]
end
这对我来说是非常奇怪和不可预测的行为。没有错误,只是跳过了部分代码。为什么会这样?
最佳答案
Why does it happen?
因为{}和do/end的优先级不同。 {} 是“更强”的。如“与最近的方法调用相关联”。所以这个
p foo {
something
}
是这样看的。
p (foo {
something
})
而do/end是这样的
p(foo) do
something
end
No error, just skip part of the code
是的,由于 ruby 的另一个特性。即“您可以将 block 传递给任何方法。然后该方法有责任使用或忽略它。”这里 p
不期待一个 block ,只是忽略它。
关于Ruby 不同的行为取决于 block 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331681/