Non ho esperienza in Ruby, quindi il mio codice sembra "brutto" e non idiomatico:
def logged_in?
!user.nil?
end
Preferisco qualcosa di simile
def logged_in?
user.not_nil?
end
Ma non riesco a trovare un tale metodo che si opponga nil?
Risposte:
quando usi ActiveSupport, c'è user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , per controllare solo se non è nullo, perché non usare
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Sembri eccessivamente preoccupato per i booleani.
def logged_in?
user
end
Se l'utente è nullo, allora loggato_in? restituirà un valore "falso". Altrimenti, restituirà un oggetto. In Ruby non abbiamo bisogno di restituire true o false, poiché abbiamo valori "true" e "falsey" come in JavaScript.
Aggiornare
Se stai usando Rails, puoi renderlo più leggibile usando il present?
metodo:
def logged_in?
user.present?
end
?
è che restituisca un valore booleano. !!value
è il modo classico per convertire qualsiasi cosa in un booleano. Non esattamente lo stesso, ma in questo caso Object#present?
in RoR è anche un bene.
Fai attenzione alle altre risposte che si presentano present?
come risposta alla tua domanda.
present?
è l'opposto di blank?
in rails.
present?
controlla se esiste un valore significativo. Queste cose possono fallire un present?
controllo:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Mentre un !nil?
controllo dà:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
controlla se un oggetto è effettivamente nil
. Tutto il resto: una stringa vuota, 0
, false
, qualunque sia, non è nil
.
present?
è molto utile, ma sicuramente non il contrario di nil?
. Confondere i due può portare a errori imprevisti.
Per il tuo caso d'uso present?
funzionerà, ma è sempre saggio essere consapevoli della differenza.
false.blank?
non è uguale afalse.nil?
present?
interrogherà il tuo database, nil?
no, starai attento
Forse questo potrebbe essere un approccio:
class Object
def not_nil?
!nil?
end
end
!self.nil?
piuttosto allora !nil?
o è self
implicito?
Puoi semplicemente usare quanto segue:
if object
p "object exists"
else
p "object does not exist"
end
Questo non funziona solo per zero ma anche per false ecc., Quindi dovresti provare per vedere se funziona nel tuo caso d'uso.
Posso offrire il !
metodo Ruby sul risultato del nil?
metodo.
def logged_in?
user.nil?.!
end
Così esoterico che RubyMine IDE lo contrassegnerà come un errore. ;-)
Sono arrivato a questa domanda cercando un metodo oggetto, in modo da poter usare la Symbol#to_proc
scorciatoia invece di un blocco; Trovo arr.find(&:not_nil?)
un po 'più leggibile di arr.find { |e| !e.nil? }
.
Il metodo che ho trovato è Object#itself
. Nel mio utilizzo, volevo trovare il valore in un hash per la chiave name
, dove in alcuni casi quella chiave veniva accidentalmente maiuscola come Name
. Quella frase è la seguente:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Come notato in altre risposte , questo fallirà in modo spettacolare nei casi in cui stai testando un booleano.
my_hash.values_at("Name", "name").find
?
map
che ho rimosso per semplicità in questo esempio, quindi come scritto qui è intercambiabile convalues_at
. La parte importante è ciò a cui viene passato find
.
present?
richiede una stringa non vuota.! "".nil?
restituisce true, ma"".present?
restituisce false.