gpt4 book ai didi

ruby - 奇怪的行为 : Hash's keys cancel dynamic method definition

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

假设我希望 String 的某些实例与其他“正常”实例的行为不同——例如取消“upcase”方法的效果。我执行以下操作:

class String
def foo
def self.upcase
self
end
self
end
end

它似乎工作正常,而且我需要它的方式:

puts "bar".upcase #=> "BAR"
puts "bar".foo.upcase #=> "bar"

但是,一旦我使用字符串的受骗实例作为哈希的键,我就开始觉得这种行为很奇怪:

puts ({"bar".foo => "code"}).keys.first.upcase #=> "BAR", not "bar"!

...这就好像 foo 方法被忽略了,String 的原始实例被用作键。

任何人都可以看到这里发生了什么?非常感谢!

最佳答案

Ruby 的 Hash 有一个特殊情况,可以将字符串用作哈希键——它会生成字符串的内部副本。

基本上它是为了防止您使用字符串(对象)作为键,然后在代码的后面更改该字符串对象,这可能会导致一些困惑的情况。可变键变得棘手。

我不会将方法修改到返回更改后的字符串类的字符串上,而是创建一个新的字符串子类来覆盖大写字母,然后设置它的值。

关于ruby - 奇怪的行为 : Hash's keys cancel dynamic method definition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1065755/

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