在Ruby中通过身份比较对象的保证方式

前端之家收集整理的这篇文章主要介绍了在Ruby中通过身份比较对象的保证方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Ruby中,通过他们的身份比较两个对象的有保证的方法是什么?给定两个变量,如果变量指向内存中完全相同的对象,我想返回true.

对于大多数Ruby对象,相等?方法通过身份比较:

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

什么是通过身份比较两个对象的愚蠢/有保证的方式,不能被打败?

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

解决方法

您可以抓住 Object#object_id的未绑定版本,将其绑定到相关对象,并查看它的内容.给你的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仍然是原始正确的.

所以这个round-about hack给你一个可靠的object_id为任何对象(根据上面的注意事项).现在,您可以抓住并比较对象ID以获得可靠的比较.

原文链接:https://www.f2er.com/ruby/273496.html

猜你在找的Ruby相关文章