gpt4 book ai didi

Ruby 不同的行为取决于 block 类型

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:25 24 4
gpt4 key购买 nike

美好的一天。我对同一 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com