gpt4 book ai didi

ruby-on-rails - 对于 ruby​​ 中的对象散列, hash.keys.index(obj) 有效但 hash.has_key?(obj) 无效。为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 16:51:56 26 4
gpt4 key购买 nike

这是我的 Rails 类

class SkinnyEmployee
include ActiveModel::Validations

attr_accessor :uid, :name

validates :uid, :presence => true

def initialize(id, name)
@uid = id
@name = name
end

def ==(other)
puts "Calling =="
raise ArgumentError.new("other is nil or bad in "+self.to_s) if other.nil? or !other.instance_of?(SkinnyEmployee)
return (self.class == other.class && self.uid == other.uid)
end

alias :eql? :==

end

我有一个 SkinnyEmployee 对象的散列。例如,

skinny_hash = {SkinnyEmployee.new("123", "xyz") => 1, SkinnyEmployee.new("456", "abc") => 2}

我有另一个要查找的 SkinnyEmployee 对象。例如,

entry = SkinnyEmployee.new("456", "abc")

当我这样做

skinny_hash.keys.index(entry)

我得到了 1,正如预期的那样。但是当我这样做的时候

skinny_hash.has_key?(entry)

我弄错了。

这是为什么呢?没有 has_key 吗?还用==还是eql?查找哈希中是否存在键?

非常感谢您的帮助!

最佳答案

首先,这让我抓狂。在我看来,您正在做的事情绝对正确,但正如您已经知道的那样,这是行不通的。

我可以帮助您解决问题:

http://ruby-doc.org/core-2.0.0/Object.html#method-i-hash

引用:

Generates a Fixnum hash value for this object. This function must have the property that a.eql?(b) implies a.hash == b.hash.

The hash value is used along with eql? by the Hash class to determine if two objects reference the same hash key. Any hash value that exceeds the capacity of a Fixnum will be truncated before being used.

我补充说:

def hash
1
end

到您的 SkinnyEmployee 类,并且 has_key?开始返回 true。显然,这不是解决方案,但我认为它至少可以让您走上通往解决方案的道路。

关于ruby-on-rails - 对于 ruby​​ 中的对象散列, hash.keys.index(obj) 有效但 hash.has_key?(obj) 无效。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19415790/

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