Ergebnis 1 bis 4 von 4

Thema: Frage zu "case a.type"

  1. #1

    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?

    Code:
    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.

  2. #2
    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:
    Code (ruby):
    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.

  3. #3
    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:
    Code:
    # 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 ausgespuckt.


    Edit: Gut, jetzt weiß ich das auch. (:

    Geändert von Cepanks (02.11.2010 um 23:22 Uhr)

  4. #4
    Vielen Dank.
    Sehr hilfreich.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •