2014-03-26 8 views
7

Ich benutze Suche von Net :: LDAP, der zurückgegebene Eintrag ist in etwa so.Wie überprüft man, ob ein Schlüssel in einem Ruby-Hash existiert?

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

Ich habe versucht, das folgende zu tun, aber ist gescheitert.

(1)

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

(2)

entry.has_key? "uid" 

Der erste Fehler sagt "to_hash" undefiniert, der zweite "has_key" undefiniert. Dann weiß ich wirklich nicht, wie ich das machen soll, im Grunde möchte ich herausfinden, ob "uid" vorhanden ist und wenn ja, wie hoch ist der entsprechende Wert?

Vielen Dank für den Tipp.

BTW, reagiert es nur auf "entry.uid", aber wenn der Suchschlüssel als String zur Verfügung gestellt wird, wie geht das? zum Beispiel ist

def get_value(key) 
    if entry has key 
    return key's value 
    end 
end 

Antwort

16

:uid ein Symbol. Das ist kein String.

versuchen Sie dies:

e.has_key? :uid 
+0

Wenn alles, was Sie haben, eine Zeichenfolge ist, könnten Sie auch "" uid ".to_sym" –

+0

"has_key" nicht definiert, aber "to_sym" ist hilfreich. Vielen Dank. – user180574

+2

'has_key?' - beachte das Fragezeichen - ist eine Methode jeder Instanz der 'Hash'-Klasse. Es kann nicht undefiniert sein, es sei denn, Sie verwenden es anders als eine Hash-Instanz. – scaryguy

2

Der Schlüssel "uid" existiert nicht. Versuchen Sie

e = Entry.new.myhash 
e.has_key?(:uid) 

Das sollte True zurückgeben. Wenn dies zu einem Fehler führt, liegt das Problem möglicherweise in Ihrer Klasse. Stellen Sie sicher, dass myhash in der Methode initialize definiert ist und dass Sie eine Getter-Methode (oder attr_reader) verwenden, um auf die Variable zugreifen zu können. Sie könnten direkt vor der Initialisierungsmethode

attr_reader :myhash 

verwenden.

Verwandte Themen