gpt4 book ai didi

ruby - 为什么使用散列的 Ruby 字符串格式在不同版本中表现不一致?

转载 作者:数据小太阳 更新时间:2023-10-29 08:57:31 24 4
gpt4 key购买 nike

我编写了一些代码,使用“动态散列”返回键的值,这些值是在其中计算的。我在 irb (RUBY_VERSION 2.3.3) 下测试了它,一切似乎都很好。下面是一个简单的例子来展示这个想法。

PROPS = Hash.new { |hash,key| key.to_s + "!" }
"Foo: %{foo} Bar: %{bar}" % PROPS # => "Foo: foo! Bar: bar!"
PROPS[:xyzzy] # => "xyzzy!"

但是然后将我的代码部署到它使用的环境中(建模工具 Sketchup 的插件)显然具有 Ruby 2.2.4 上面的字符串格式示例会产生 KeyError:key{foo} not found。

PROPS = Hash.new { |hash,key| key.to_s + "!" }
"Foo: %{foo} Bar: %{bar}" % PROPS # KeyError: key{foo} not found
PROPS[:xyzzy] # => "xyzzy!"

但是使用任何键访问散列都可以正常工作...阅读 http://ruby-doc.org/core-2.2.4/Kernel.html#method-i-sprintf没有提供太多说明为什么哈希默认值不会按预期运行的方式。

显然我可以做不同的事情,比如发明我自己的替换函数和变量语法。顺便说一句,显然传递给“%”或 sprintf 的“散列”实际上必须是 Hash 对象,这违反了 Ruby 假定的鸭子类型灵 active 。

最佳答案

我可以确认它在 Ruby 2.1.5 中不起作用。

我将提供一些提示,告诉您如何在不从 MRI 中读取 C 或 Ruby 代码的情况下找出要定义的 ruby​​ 代码来运行这些东西。

我知道,这不是一个完整的答案,但文本太长,无法发表评论。

下面是irb session

  >> detector = Object.new
=> #<Object:0x00000002257900>
>> def detector.method_missing m
>> puts m.to_s
>> end
=> :method_missing
>> "Foo: %{fnoo} Bar: %{bar}" % detector
to_ary
to_hash
ArgumentError: one hash required
from (irb):37:in `%'
from (irb):37
from /home/felix/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>'

这告诉我们,在调用插值方法期间,我们的虚拟“检测器”对象(准确地说是 to_hash;通过其他测试我知道如果给定对象是 to_ary 也会被调用一个哈希,所以我们可以忽略那个)。

然而,它并没有告诉我们是否已经有类似 detector.classdetector is_a Hash? 等东西。被召唤。

现在我等待反对票;)

顺便说一句,如果您想通过 C 深入研究 - 我开始相信在这种情况下可能需要这样做 - 您可以从这里开始挖掘:https://github.com/ruby/ruby/blob/6d728bdae9de565ad9d0b2fee2d4c2a33c6f4eac/sprintf.c#L579 (在 ruby​​ 2.1 上或多或少是“sprintf”)。

关于ruby - 为什么使用散列的 Ruby 字符串格式在不同版本中表现不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564592/

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