Często używałem tego wzorca, aby rozszerzyć podstawowe zachowanie Rubiego, aby ułatwić sobie konwersję dowolnych typów danych na wartości logiczne, co bardzo ułatwia radzenie sobie z różnymi parametrami adresu URL itp.
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
Powiedzmy, że masz parametr, foo
którym może być:
- liczba całkowita (0 oznacza fałsz, wszystkie inne są prawdziwe)
- prawdziwy boolean (prawda / fałsz)
- ciąg („prawda”, „fałsz”, „0”, „1”, „PRAWDA”, „FAŁSZ”)
- zero
Zamiast używać kilku warunków, możesz po prostu zadzwonić, foo.to_boolean
a resztę magii wykona za Ciebie.
W Railsach dodaję to do inicjalizatora nazwanego core_ext.rb
w prawie wszystkich moich projektach, ponieważ ten wzorzec jest tak powszechny.
## 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
true
ifalse
czy to wystarczy, jeśli wynik jest truthy lub falsey? Jeśli to drugie, tofalse
jest już falsey i obatrue
i'true'
są truthy, więc jedyną wartością, dla której wynik nie jest już prawidłowy, to'false'
:if input == 'false' then true else input end
powinien to zrobić.