gpt4 book ai didi

ruby - 在 Ruby 中按身份比较对象的保证方法

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

在 Ruby 中,根据对象的身份比较两个对象的可靠方法是什么?给定两个变量,如果变量指向内存中完全相同的对象,我想返回 true。

对于大多数 Ruby 对象,equal? 方法按身份进行比较:

f = g = Object.new
p f.equal? g # => true

但是,这并不适用于所有对象。例如:

class F
def ==(obj) false end
def ===(obj) false end
def eql?(obj) false end
def equal?(obj) false end
def object_id; self end
end

f = g = F.new
p f == g # => false
p f === g # => false
p f.eql? g # => false
p f.equal? g # => false
p f.object_id == g.object_id # => false

按身份比较两个对象的万无一失/有保证的方法是什么?

这是一个纯粹的智力问题。任何以“为什么”开头的问题的答案都可能是“因为我很好奇。”

最佳答案

您可以获取未绑定(bind)版本的 Object#object_id ,将它绑定(bind)到有问题的对象上,然后看看它说了什么。给你的 F 类加上一个:

class F
# ...
def inspect; 'pancakes!' end # Just so we can tell what we have later.
end

然后:

>> f = F.new
>> f.object_id
=> pancakes!
>> unbound_object_id = Object.instance_method(:object_id)
>> unbound_object_id.bind(f).call
=> 2153000340
>> ObjectSpace._id2ref(2153000340).inspect
=> "pancakes!"

当然,如果有人打开 Object 并替换 object_id 那么你就倒霉了,但如果有人这样做,这将是你最不关心的问题。如果您可以获取您的 unbound_object_id UnboundMethod在加载任何其他内容之前,如果有人更改 Object#object_id 并不重要,因为您的 unbound_object_id 仍将是原始正确的。

所以这个迂回 hack 为您提供了任何对象的可靠 object_id(受上述警告约束)。现在您可以抓取并比较对象 ID 以获得可靠的比较。

关于ruby - 在 Ruby 中按身份比较对象的保证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884668/

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