PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu "case a.type"



Cornix
02.11.2010, 22:00
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.

-KD-
02.11.2010, 23:18
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.

Cepanks
02.11.2010, 23:18
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. (:

Cornix
03.11.2010, 16:03
Vielen Dank.
Sehr hilfreich.