Ho usato spesso questo modello per estendere il comportamento di base di Ruby per rendere più facile trattare con la conversione di tipi di dati arbitrari valori booleani, che lo rende molto facile da affrontare con diversi parametri URL, ecc
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
Quindi diciamo che avete un parametro che può essere foo
:
- un numero intero (0 è falso, tutti gli altri sono vere)
- una vera booleano (true/false)
- una stringa ("true", "false", "0", "1", " TRUE", 'FALSE')
- nil
Invece di usare un po 'di condizionali, si può chiamare foo.to_boolean
e farà il resto della magia per voi.
In Rails, aggiungo questo a un inizializzatore denominato core_ext.rb
in quasi tutti i miei progetti poiché questo modello è così comune.
## 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
fonte
2017-09-25 20:26:41
Il risultato * deve * essere uno dei due valori 'true' o' false' o è sufficiente se il risultato è vero o falso? Se quest'ultimo, quindi 'false' è già falso, ed entrambi' true' e ''true'' sono veri, quindi l'unico valore per il quale il risultato non è già corretto, è'' false'': 'if input = = 'false' allora vero else input end' dovrebbe farlo. –
Questo è un ottimo commento Jorg, tuttavia suppongo che per alcune applicazioni sia necessario avere il valore booleano vero o falso e non solo un valore che sia vero o falso. – emery
Emery, se hai bisogno di restituire un booleano puoi anteporre l'espressione di @ Jörg con due "not": '!! (se input == 'false' allora vero else input end)'. Il secondo '!' Converte il valore di ritorno in un valore booleano che è l'opposto di quello che vuoi; il primo '!' esegue quindi la correzione. Questo "trucco" è in circolazione da molto tempo. Non tutti gli sono affezionati. –