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 como
def logged_in?
user.not_nil?
end
Pero no puedo encontrar un método que se oponga nil?
Respuestas:
cuando usa ActiveSupport, hay user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , para verificar solo si no es nulo, ¿por qué no usar
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Parece demasiado preocupado por los valores booleanos.
def logged_in?
user
end
Si el usuario es nulo, entonces log_in? devolverá un valor "falsey". De lo contrario, devolverá un objeto. En Ruby no necesitamos devolver verdadero o falso, ya que tenemos valores de "verdadero" y "falso" como en JavaScript.
Actualizar
Si está usando Rails, puede hacer que esto se lea mejor usando el present?
método:
def logged_in?
user.present?
end
?
es que devuelva un booleano. !!value
es la forma clásica de convertir cualquier cosa a booleana. No es exactamente lo mismo, pero en este caso Object#present?
en RoR también es bueno.
Tenga cuidado con otras respuestas que se presentan present?
como una respuesta a su pregunta.
present?
es lo contrario de blank?
en rieles.
present?
comprueba si hay un valor significativo. Estas cosas pueden fallar en una present?
verificación:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Mientras que un !nil?
cheque da:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
comprueba si un objeto es realmente 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 contrario de nil?
. Confundir los dos puede provocar errores inesperados.
Porque su caso de uso present?
funcionará, pero siempre es aconsejable ser consciente de la diferencia.
false.blank?
no es lo mismo quefalse.nil?
present?
consultará su base de datos, nil?
no, tenga cuidado con eso
Quizás este podría ser un enfoque:
class Object
def not_nil?
!nil?
end
end
!self.nil?
más bien entonces !nil?
, o está self
implícito?
Puedes usar lo siguiente:
if object
p "object exists"
else
p "object does not exist"
end
Esto no solo funciona para nil sino también falso, etc., por lo que debe probar para ver si funciona en su caso de uso.
¿Puedo ofrecer el !
método Ruby-esque sobre el resultado del nil?
método?
def logged_in?
user.nil?.!
end
Tan esotérico que RubyMine IDE lo marcará como un error. ;-)
Llegué a esta pregunta buscando un método de objeto, para poder usar la Symbol#to_proc
taquigrafía en lugar de un bloque; Encuentro arr.find(&:not_nil?)
algo más legible que arr.find { |e| !e.nil? }
.
El método que encontré es Object#itself
. En mi uso, quería encontrar el valor en un hash para la clave name
, donde en algunos casos esa clave se capitalizó accidentalmente como Name
. Esa frase es la siguiente:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Como se señaló en otras respuestas , esto fallará espectacularmente en los casos en que esté probando un booleano.
my_hash.values_at("Name", "name").find
?
map
que eliminé por simplicidad en este ejemplo, así que como está escrito aquí es intercambiable values_at
. La parte importante es a lo que se le pasa find
.
present?
requiere una cadena que no esté en blanco.! "".nil?
devuelve verdadero, pero"".present?
devuelve falso.