Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu "case a.type"
Guten Abend.
Eine kleine, hoffentlich schnell beantwortete Frage.
Könnte mir jemand erklären warum folgende Zeilen Code nicht in der Hinsicht funktionieren wie ich es mir erhofft habe?
class G
end
a = G.new
case a.type
when G
print("a.type == G")
else
print("a.type != G")
end
Das Ergebnis welches ich leider erhalte lautet "a.type != G".
Kann ich eine solche Unterscheidung nach der Klasse von a vornehmen ohne multiple If/Then/Else Statements ineinander zu schachteln?
Vielen Dank.
Cornix.
Prinzipiell würde ich statt #type die Methode #class verwenden. type ist deprecated und in späteren Rubyversionen nicht mehr vorhanden. Im Maker kann man es natürlich trotzdem noch nutzen. Aber strenggenommen ist G eine Klasse, kein "Typ".
Ansonsten muss der Code folgendermaßen aussehen:
case a
when G
print "G === a"
else
print "not (G === a)"
end
Wichtig ist, dass das case-Statement einen Vergleich mit der === Methode durchführt. Und zwar mit der Variable a als Parameter. So darf jede Klasse selbst bestimmen, wie sie in einem Case verglichen wird. Die === Methode prüft nicht unbedingt immer auf Gleichheit. z.B. gilt
(1..10) === 5 #=> true
/\d+/ === "123" #=> true
und eben
Array === [] #=> true
In deinem Fall schreibst du im Prinzip
G === G
Was letztlich bedeutet: Ist G eine Instanz von G. Das ist aber nicht der Fall. Class === G würde hingegen true ergeben.
Also entweder case-Statements gar nicht erst verwenden, oder vorher in die API gucken wie die === Methode für die jeweiligen Klassen definiert ist.
Warum es so nicht funktioniert, kann ich dir auch nicht sagen, aber das ganze lässt sich trotzdem mittels Case lösen.
Meine Idee war, das ganze einfach in einen String umzuwandeln:
# Object#type ist deprecated, daher Object#class.
class G; end
a = G.new
case a.class.to_s
when 'G' then print '== G'
else print '!= G'
end
# Gibt "== G" aus
Eine kurze Google-Suche hat dann aber das hier (http://www.postal-code.com/mrhappy/blog/2007/02/01/ruby-comparing-an-objects-class-in-a-case-statement/) ausgespuckt.
Edit: Gut, jetzt weiß ich das auch. (:
Vielen Dank.
Sehr hilfreich.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.