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 è selfimplicito?
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_procscorciatoia 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?
mapche 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.