ventajas tutorial sirve rails que para documentacion desventajas descargar ruby

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