Pregunta ¿Hay un Ruby, o Ruby-ismo para not_nil? opuesto de nil? ¿método?


No tengo experiencia en Ruby, por lo que mi código se siente "feo" y no idiomático:

def logged_in?
  !user.nil?
end

Prefiero tener algo así como

def logged_in?
  user.not_nil?
end

Pero no puedo encontrar un método tal que sea opuesto nil?


74
2017-10-25 08:04


origen


Respuestas:


cuando usas ActiveSupport, hay user.present?  http://api.rubyonrails.org/classes/Object.html#method-i-present%3F, para verificar solo por no-nil, ¿por qué no usar

def logged_in?
  user # or !!user if you really want boolean's
end

47
2017-10-25 08:12



Pareces demasiado preocupado con los booleanos.

def logged_in?
  user
end

Si el usuario es nulo, ¿has iniciado sesión? devolverá un valor de "falsey". De lo contrario, devolverá un objeto. En Ruby no necesitamos devolver verdadero o falso, ya que tenemos valores "verídicos" y "defectuosos" como en JavaScript.

Actualizar

Si está utilizando Rails, puede hacer que esto se lea mejor utilizando el present? método:

def logged_in?
  user.present?
end

47
2017-10-25 15:42



Tal vez este podría ser un enfoque:

class Object
  def not_nil?
    !nil?
  end
end

14
2017-10-25 08:06



Tenga cuidado con otras respuestas que presentan present? como una respuesta a tu pregunta.

present? es lo opuesto a blank? en rieles.

present? verifica si hay un valor significativo. Estas cosas pueden fallar present? comprobar:

"".present? # false
"    ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false

Considerando que !nil? cheque da:

!"".nil? # true
!"    ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true

nil? comprueba si un objeto es en realidad nil. Cualquier otra cosa: una cadena vacía, 0, false, lo que sea, no es nil.

present? es muy útil, pero definitivamente no es lo opuesto a nil?. Confundir los dos puede conducir a errores inesperados.

Para su caso de uso present? funcionará, pero siempre es inteligente estar al tanto de la diferencia.


5
2017-07-28 14:03



Puedes usar lo siguiente:

if object
  p "object exists"
else
  p "object does not exist"
end

Esto no solo funciona para nada, sino también para falso, por lo que debe probar para ver si funciona en su uso.


4
2017-10-25 08:11