Je n'ai pas d'expérience en Ruby, donc mon code semble "moche" et pas idiomatique:
def logged_in?
!user.nil?
end
Je préfère avoir quelque chose comme
def logged_in?
user.not_nil?
end
Mais ne peut pas trouver une telle méthode qui s'oppose nil?
lorsque vous utilisez ActiveSupport, il y a user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , pour vérifier uniquement non nul, pourquoi ne pas utiliser
def logged_in?
user # or !!user if you really want boolean's
end
Vous semblez trop préoccupé par les booléens.
def logged_in?
user
end
Si l'utilisateur est nul, alors log_in? renverra une valeur "falsey". Sinon, il retournera un objet. Dans Ruby nous n'avons pas besoin de retourner vrai ou faux, car nous avons des valeurs "truey" et "falsey" comme en JavaScript.
Mise à jour
Si vous utilisez Rails, vous pouvez améliorer la lecture en utilisant le present?
méthode:
def logged_in?
user.present?
end
Méfiez-vous des autres réponses présentant present?
comme réponse à votre question.
present?
est l'opposé de blank?
dans Rails.
present?
vérifie s'il existe une valeur significative. Ces choses peuvent échouer un present?
vérifier:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Alors qu'un !nil?
le chèque donne:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
vérifie si un objet est réellement nil
. Autre chose: une chaîne vide, 0
, false
, peu importe, n'est pas nil
.
present?
est très utile, mais certainement pas l'opposé de nil?
. La confusion entre les deux peut conduire à des erreurs inattendues.
Pour votre cas d'utilisation present?
fonctionnera, mais il est toujours sage d'être conscient de la différence.
Cela pourrait peut-être être une approche:
class Object
def not_nil?
!nil?
end
end
Vous pouvez simplement utiliser ce qui suit:
if object
p "object exists"
else
p "object does not exist"
end
Cela ne fonctionne pas seulement pour nil mais aussi pour false, etc., vous devriez donc tester pour voir si cela fonctionne dans votre cas d'utilisation.
Je suis arrivé à cette question à la recherche d'une méthode objet, afin de pouvoir utiliser le raccourci Symbol#to_proc
au lieu d'un bloc; Je trouve arr.find(&:not_nil?)
un peu plus lisible que arr.find { |e| !e.nil? }
.
La méthode que j'ai trouvée est Object#itself
. Dans mon utilisation, je voulais trouver la valeur dans un hachage pour la clé name
, où dans certains cas, cette clé était accidentellement mise en majuscule comme Name
. Ce one-liner est le suivant:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Comme indiqué dans autres réponses , cela échouera de manière spectaculaire dans les cas où vous testez un booléen.
Puis-je offrir le Ruby-esque !
méthode sur le résultat de la nil?
méthode.
def logged_in?
user.nil?.!
end
Si ésotérique que RubyMine IDE le signalera comme une erreur. ;-)