Ich habe dieses Muster häufig verwendet, um das Kernverhalten von Ruby zu verlängern, um es einfacher mit der Umwandlung von beliebigen Datentypen umgehen zu boolesche Werte, die es einfach macht mit unterschiedlichen URL-Parameter zu behandeln usw.
class String
def to_boolean
ActiveRecord::Type::Boolean.new.cast(self)
end
end
class NilClass
def to_boolean
false
end
end
class TrueClass
def to_boolean
true
end
def to_i
1
end
end
class FalseClass
def to_boolean
false
end
def to_i
0
end
end
class Integer
def to_boolean
to_s.to_boolean
end
end
Also lassen Sie uns sagen, dass Sie einen Parameter foo
haben, die sein kann:
- eine ganze Zahl (0 falsch ist, alle anderen sind wahr)
- ein wahrer Boolescher (true/false)
- eine Zeichenfolge ("wahr", "falsch", "0", "1", " TRUE“,‚false‘)
- nil
Statt eine Reihe von conditionals zu verwenden, können Sie nur foo.to_boolean
anrufen und es wird für Sie den Rest der Magie tun.
In Rails, ich füge dies zu einem Initialisierer namens core_ext.rb
in fast allen meiner Projekte, da dieses Muster so üblich ist.
## EXAMPLES
nil.to_boolean == false
true.to_boolean == true
false.to_boolean == false
0.to_boolean == false
1.to_boolean == true
99.to_boolean == true
"true".to_boolean == true
"foo".to_boolean == true
"false".to_boolean == false
"TRUE".to_boolean == true
"FALSE".to_boolean == false
"0".to_boolean == false
"1".to_boolean == true
true.to_i == 1
false.to_i == 0
Muss das Ergebnis * einer der beiden Werte 'true' oder' false' sein oder ist es ausreichend, wenn das Ergebnis truthy oder falsch ist? Wenn letzteres ist, dann ist "falsch" bereits falsch, und sowohl "wahr" als auch "wahr" sind truthy, also ist der einzige Wert, für den das Ergebnis nicht bereits korrekt ist, "false": 'if input = = 'false' dann wahr else input end 'sollte es tun. –
Das ist ein toller Kommentar Jörg, aber ich würde annehmen, dass es für einige Anwendungen notwendig ist, den booleschen Wert wahr oder falsch zu haben und nicht nur einen Wert, der truthy oder falsch ist. – emery
Emery, wenn Sie einen booleschen Wert zurückgeben möchten, könnten Sie @ Jörgs Ausdruck mit zwei "nots" voranstellen: '!! (wenn input == 'false' dann true else input end)'. Das zweite '!' Wandelt den Rückgabewert in einen booleschen Wert um, der das Gegenteil dessen ist, was Sie wollen; Das erste '!' macht dann die Korrektur. Dieser "Trick" gibt es schon lange. Nicht jeder mag es. –