如何检查 Ruby 哈希表中是否存在某个键?

17

我正在使用Net::LDAP进行搜索,返回的条目类似于这样。

#<Net::LDAP::Entry:0x7f47a6491c00
 @myhash=
  {:loginshell=>["/bin/bash"],
   :cn=>["M... R..."],
   :homedirectory=>["/mnt/home/m..."],
   :uid=>["m..."],
   :userpassword=>["{CRYPT}$1$3zR/C...$R1"],
   ...
}>

我尝试做以下的事情,但失败了。

(1)

e = entry.to_hash
e.has_key? "uid" 

(2)

entry.has_key? "uid" 
第一个错误说“to_hash”未定义,第二个错误说“has_key”未定义。我真的不知道怎么做,基本上我想找到是否存在“uid”,如果存在就获取它对应的值。
非常感谢您的提示。
顺便说一句,它只响应于“entry.uid”,但是如果搜索关键字以字符串形式提供,该怎么办?例如,
def get_value(key)
  if entry has key 
    return key's value
  end
end
2个回答

35
< p > :uid 是一个 Symbol,而不是一个 String

尝试这个:

e.has_key? :uid

如果你只有一个字符串,你也可以使用"uid".to_sym - John Dibling
“has_key”未定义,但“to_sym”很有帮助。谢谢。 - user180574
2
has_key?(注意问号)是 Hash 类的任何实例的方法。除非您将其用于与 Hash 实例不同的内容,否则它不会被未定义。 - scaryguy
这就是我感到困惑的原因,我不知道它是什么。最终我使用了“entry.each do |k, v|”来分解成键值对。 - user180574
只需将 .class 添加到任何对象即可知道它的类类型,非常简单。执行 e.class 即可查看其类型。 - scaryguy

6
键"uid"不存在。请尝试:
e = Entry.new.myhash
e.has_key?(:uid)

那应该返回true。如果出现错误,则问题可能在于您的类中。请确保myhash在initialize方法中定义,并且使用getter方法(或attr_reader)以访问变量。您可以使用

attr_reader :myhash

在初始化方法之前。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接