Я часто использовал этот шаблон, чтобы расширить базовое поведение Ruby, чтобы упростить преобразование произвольных типов данных в логические значения, что упрощает работу с различными параметрами URL и т. Д.
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
Допустим, у вас есть параметр, foo
который может быть:
- целое число (0 - ложь, все остальные - истина)
- истинное логическое значение (истина / ложь)
- строка («истина», «ложь», «0», «1», «ИСТИНА», «ЛОЖЬ»)
- ноль
Вместо того, чтобы использовать кучу условных операторов, вы можете просто позвонить, foo.to_boolean
и все остальное волшебство сделает за вас.
В Rails я добавляю это в инициализатор, названный core_ext.rb
почти во всех моих проектах, поскольку этот шаблон очень распространен.
## 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
илиfalse
или достаточно , если результат truthy или falsey? Если последнее, thenfalse
уже является ложным, и обаtrue
и'true'
являются правдивыми, поэтому единственное значение, для которого результат еще не верен, это'false'
:if input == 'false' then true else input end
should do it.