Ich kann nicht leicht überprüfen, ob ein Objekt ein Boolescher Wert ist. Gibt es so etwas in Ruby?
true.is_a?(Boolean)
false.is_a?(Boolean)
Im Moment mache ich das und möchte es verkürzen:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
quelle
quelle
Antworten:
Der einfachste Weg, den ich mir vorstellen kann:
quelle
Ich finde das prägnant und selbstdokumentierend:
Wenn Sie Rails oder ActiveSupport verwenden, können Sie sogar eine direkte Abfrage mit durchführen
in?
Das Überprüfen aller möglichen Werte würde ich für Floats nicht empfehlen, aber machbar, wenn es nur zwei mögliche Werte gibt!
quelle
foo == true or foo == false
dass jemand einen Kommentar abgegeben hat.!!foo == foo
.Boolean
In Ruby gibt es keine Klasse. Die einzige Möglichkeit, dies zu überprüfen, besteht darin, das zu tun, was Sie tun (das Objekt mittrue
undfalse
oder die Klasse des Objekts mitTrueClass
und zu vergleichenFalseClass
). Sie können sich nicht vorstellen, warum Sie diese Funktionalität benötigen würden, können Sie das erklären? :) :)Wenn Sie diese Funktionalität jedoch wirklich benötigen, können Sie sie hacken:
quelle
expect(some_method?(data)).to be_a(Boolean)
"quotes"
aber nicht mit Zahlen und BooleschenWie oben erwähnt, gibt es keine boolesche Klasse, nur TrueClass und FalseClass. Sie können jedoch jedes Objekt als Subjekt von if / when verwenden und alles ist wahr, außer Instanzen von FalseClass und nil
Boolesche Tests geben eine Instanz der FalseClass oder TrueClass zurück
Das folgende Monkeypatch to Object zeigt Ihnen, ob es sich bei einer Instanz um TrueClass oder FalseClass handelt
Das Ausführen einiger Tests mit irb führt zu den folgenden Ergebnissen
quelle
self == true or self == false
. Dies sind die einzigen Instanzen von TrueClass und FalseClass.boolean
, eine für TrueClass / FalseClass und eine für Object.Time#==
Ruby 1.8 dazu führt, dass ein Vergleich mit Nicht-Zeit-Werten eher null als falsch zurückgibt.Wenn Ihr Code sinnvoll als case-Anweisung geschrieben werden kann, ist dies ziemlich anständig:
quelle
Ein boolesches Objekt hat entweder die Klasse TrueClass oder FalseClass, daher sollte der folgende Einzeiler den Trick ausführen
Das Folgende würde Ihnen auch ein Ergebnis der booleschen Typprüfung für wahr / falsch geben
quelle
Probieren Sie diese
(x == true) ^ (x == false)
Notiz aus , Sie benötigen die Klammer, aber diese ist schöner und kompakter.Es besteht sogar das vorgeschlagene wie "cuak", aber kein "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Hinweis : Stellen Sie sicher, dass dies so grundlegend ist, dass Sie es auch in anderen Sprachen verwenden können, ohne dass ein "Ding ist boolesch" angezeigt wird.
Anmerkung 2 : Sie können dies auch verwenden, um zu sagen, dass eines von ??: ist,
"red", "green", "blue"
wenn Sieadd more XORS
... oder sagen, dass dieses Ding eines von ??: ist4, 5, 8, 35
.quelle
Dieses Juwel fügt Ruby eine Boolesche Klasse mit nützlichen Methoden hinzu.
https://github.com/RISCfuture/boolean
Verwenden:
Dann dein
wird genau so funktionieren, wie Sie es erwarten.
quelle
Nein, nicht so, als hättest du deinen Code. Es gibt keine Klasse namens Boolean. Mit all den Antworten, die Sie haben, sollten Sie in der Lage sein, eine zu erstellen und zu verwenden. Sie wissen, wie man Klassen erstellt, nicht wahr? Ich bin nur hergekommen, weil ich mich selbst über diese Idee gewundert habe. Viele Leute könnten sagen "Warum? Sie müssen nur wissen, wie Ruby Boolean verwendet". Deshalb hast du die Antworten bekommen, die du getan hast. Also danke für die Frage. Denkanstöße. Warum hat Ruby keine Boolesche Klasse?
Beachten Sie, dass Objekte keine Typen haben. Sie sind Klassen. Objekte haben Daten. Wenn Sie also Datentypen sagen, ist dies eine falsche Bezeichnung.
Versuchen Sie auch Rand 2, da Rand 1 immer 0 zu geben scheint. Rand 2 gibt hier einige Male 1 oder 0 Klicklauf. https://repl.it/IOPx/7
Obwohl ich nicht wissen würde, wie ich selbst eine Boolesche Klasse machen soll. Ich habe damit experimentiert, aber ...
Zumindest haben wir diese Klasse jetzt, aber wer weiß, wie man die richtigen Werte erhält?
quelle