Eu frequentemente usei esse padrão para estender o comportamento central do Ruby para tornar mais fácil lidar com a conversão de tipos de dados arbitrários em valores booleanos, o que torna realmente fácil lidar com parâmetros variáveis de URL, etc.
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
Então, digamos que você tenha um parâmetro foo
que pode ser:
- um inteiro (0 é falso, todos os outros são verdadeiros)
- um verdadeiro booleano (verdadeiro / falso)
- uma string ("verdadeiro", "falso", "0", "1", "VERDADEIRO", "FALSO")
- nada
Em vez de usar um monte de condicionais, você pode apenas chamar foo.to_boolean
e ele fará o resto da mágica para você.
No Rails, eu adiciono isso a um inicializador chamado core_ext.rb
em quase todos os meus projetos, já que esse padrão é muito comum.
## 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
oufalse
ou é suficiente se o resultado for verdadeiro ou falso? Se for o último, entãofalse
já é falsey, e ambostrue
e'true'
são verdadeiros, então o único valor para o qual o resultado ainda não está correto é'false'
:if input == 'false' then true else input end
deveria fazê-lo.