tutorial - Comprobando si una variable no es nula y no es cero en ruby
ruby wikipedia (16)
Estoy usando el siguiente código para verificar si una variable no es nula y no es cero
if(discount != nil && discount != 0)
...
end
¿Hay una mejor manera de hacer esto?
A partir de Ruby 2.3.0, puede combinar el operador de navegación segura ( &.
) Con Numeric#nonzero?
. &.
devuelve nil
si la instancia fue nil
y nonzero?
- Si el número era 0
:
if discount&.nonzero?
# ...
end
O postfix:
do_something if discount&.nonzero?
Al tratar con un registro de base de datos , me gusta inicializar todos los valores vacíos con 0, usando el asistente de migración:
add_column :products, :price, :integer, default: 0
Creo que lo siguiente es lo suficientemente bueno para el código rubí. No creo que pueda escribir una prueba de unidad que muestre alguna diferencia entre esto y el original.
if discount != 0
end
Podrías hacer esto:
if (!discount.nil? && !discount.zero?)
El orden es importante aquí, porque si el discount
es nil
, ¿entonces no tendrá un zero?
método. La evaluación de cortocircuito de Ruby debería evitar que intente evaluar discount.zero?
Sin embargo, si el discount
es nil
.
Puede aprovechar el método #to_i
proporcionado por NilClass
, que devolverá cero para valores nil
:
unless discount.to_i.zero?
# Code here
end
Si el discount
puede ser números fraccionarios, puede usar #to_f
en #to_f
lugar, para evitar que el número se #to_f
a cero.
Puede inicializar el descuento a 0 siempre que se garantice que su código no lo intente y lo use antes de que se inicialice. Eso eliminaría un cheque, supongo, no puedo pensar en otra cosa.
Puedes convertir tu fila vacía a valor entero y marcar cero ?.
"".to_i.zero? => true
nil.to_i.zero? => true
Una solución alternativa es utilizar Refinamientos, de esta manera:
module Nothingness
refine Numeric do
alias_method :nothing?, :zero?
end
refine NilClass do
alias_method :nothing?, :nil?
end
end
using Nothingness
if discount.nothing?
# do something
end
ok, después de 5 años han pasado ....
if discount.try :nonzero?
...
end
unless [nil, 0].include?(discount) # ... end
unless discount.nil? || discount == 0 # ... end
class Object
def nil_zero?
self.nil? || self == 0
end
end
# which lets you do
nil.nil_zero? # returns true
0.nil_zero? # returns true
1.nil_zero? # returns false
"a".nil_zero? # returns false
unless discount.nil_zero?
# do stuff...
end
Tenga cuidado con los descargos de responsabilidad habituales ... gran poder / responsabilidad, parches de monos que conducen al lado oscuro, etc.
def is_nil_and_zero(data)
data.blank? || data == 0
end
Si pasamos "" devolverá falso mientras que en blanco? devuelve verdadero Igual es el caso cuando los datos = falso en blanco? devuelve verdadero para nil, falso, vacío o una cadena de espacio en blanco. ¿Así que es mejor usar en blanco? método para evitar la cadena vacía también.
if (discount||0) != 0
#...
end
if discount and discount != 0
..
end
actualización, será false
para discount = false
if discount.nil? || discount == 0
[do something]
end