web-dev-qa-db-fra.com

Existe-t-il un Ruby, ou Ruby-isme pour not_nil? opposé à zéro? méthode?

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?

80
berkes

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
49
lwe

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
48
Samo

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.

16
A Fader Darkly

Cela pourrait peut-être être une approche:

class Object
  def not_nil?
    !nil?
  end
end
15
Geo

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.

4
Bitterzoet

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.

1
Ian

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. ;-)

0