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