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

标签 ruby block

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

相关文章:

ruby - 如何使用 RMagick 和自动换行在图像上呈现文本?

ruby-on-rails - 从 View 中输入 Rails

html - block 文本旁边的图像

ios - block 未执行

html - 替换清除 :both with pseudo class

Mysql::错误:指定的键太长;最大 key 长度为 767 字节:创建索引

ruby - 只选择那些有值的可选命名参数的明智方法

ruby - 为什么是_a?哈希类返回 false?

css - Div 元素未在另一个 div 元素的中间对齐

ruby - 在 Block (self) Ruby 中获取 Block 的名称