gpt4 book ai didi

ruby - OpenStruct.new 存储属性但不检索它

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:37 25 4
gpt4 key购买 nike

在创建一个新的 Ruby OpenStruct 对象后,我可以存储属性但不能检索它们(我得到一个空行并返回 nil):

obj = OpenStruct.new # => #<OpenStruct>
obj.x = 10
obj.y = 20
obj # => #<OpenStruct x=10, y=20>
obj.x # => 10
obj.y #
# => nil

如果我尝试用不同的名称存储其他属性,一切都会按预期进行。这个问题似乎只有在我存储名为 y 的属性时才会发生。我正在使用以下版本:

ruby 1.9.2p320(2012-04-20 修订版 35421)[i686-linux]

有人知道发生了什么事吗?

最佳答案

某处有东西在拉进来 Psych对于 YAML 的东西。心理 patches Kernel添加别名为 ypsych_y 方法。所以,一切都定义了一个 y 方法:

> o = OpenStruct.new
> o.method(:y)
=> #<Method: OpenStruct(Kernel)#psych_y>

据我所知,OpenStruct 使用 method_missing和一个内部 Hash 来产生访问器和修改器方法;但是,从那个“友好”的内核补丁中已经有一个 y,所以 OpenStruct 的魔力无法处理 y 方法,因为 Psych 的魔力挡住了路。突变器 y= 很好,因此您可以安全地 o.y = 11 并在 o 中查看您的 11 .

您可以像这样删除 y:

> o = OpenStruct.new
> o.class_eval('undef_method :y')
> o.y = 11
> o.y
=> 11

您可能会从 Kernel 中删除该方法,并希望没有任何东西依赖于那个愚蠢的 y 别名:

> Kernel.send(:undef_method, :y)
> o = OpenStruct.new
> o.y = 11
> o.y
=> 11

或者您可以将它从 OpenStruct 中删除:

> OpenStruct.send(:undef_method, :y)
> o = OpenStruct.new
> o.y = 11
> o.y
=> 11

这就是为什么很多人不喜欢猴子补丁,尤其是像Kernel这样基础的猴子补丁。

关于ruby - OpenStruct.new 存储属性但不检索它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13221163/

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