Antworten:
Wenn Sie ActiveSupport verwenden, gibt es user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , um nur auf Nicht-Null zu prüfen, warum nicht verwenden
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Sie scheinen übermäßig besorgt über Boolesche Werte zu sein.
def logged_in?
user
end
Wenn der Benutzer Null ist, dann angemeldet? gibt einen "Falsey" -Wert zurück. Andernfalls wird ein Objekt zurückgegeben. In Ruby müssen wir weder true noch false zurückgeben, da wir wie in JavaScript "truey" - und "falsey" -Werte haben.
Aktualisieren
Wenn Sie Rails verwenden, können Sie dies mithilfe der folgenden present?
Methode besser lesen :
def logged_in?
user.present?
end
?
ist, dass sie einen Booleschen Wert zurückgibt. !!value
ist der klassische Weg, etwas in einen Booleschen Wert umzuwandeln. Nicht genau das gleiche, aber in diesem Fall ist Object#present?
RoR auch gut.
Passen Sie auf andere Antworten auf, die present?
als Antwort auf Ihre Frage angezeigt werden.
present?
ist das Gegenteil von blank?
in Schienen.
present?
prüft, ob ein aussagekräftiger Wert vorliegt. Diese Dinge können eine present?
Prüfung nicht bestehen:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Während ein !nil?
Scheck ergibt:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
prüft, ob ein Objekt tatsächlich ist nil
. Alles andere: ein leerer String, 0
, false
, was auch immer, ist nicht nil
.
present?
ist sehr nützlich, aber definitiv nicht das Gegenteil von nil?
. Die Verwechslung der beiden kann zu unerwarteten Fehlern führen.
Für Ihren Anwendungsfall present?
wird es funktionieren, aber es ist immer ratsam, sich des Unterschieds bewusst zu sein.
false.blank?
ist nicht dasselbe wiefalse.nil?
Vielleicht könnte dies ein Ansatz sein:
class Object
def not_nil?
!nil?
end
end
!self.nil?
eher so sein !nil?
oder ist es self
implizit?
Sie können einfach Folgendes verwenden:
if object
p "object exists"
else
p "object does not exist"
end
Dies funktioniert nicht nur für Null, sondern auch für Falsch usw. Daher sollten Sie testen, ob es in Ihrem Anwendungsfall funktioniert.
Darf ich die Ruby-ähnliche !
Methode für das Ergebnis der nil?
Methode anbieten?
def logged_in?
user.nil?.!
end
So esoterisch, dass RubyMine IDE es als Fehler kennzeichnet. ;-);
Ich kam zu dieser Frage und suchte nach einer Objektmethode, damit ich die Symbol#to_proc
Kurzschrift anstelle eines Blocks verwenden konnte. Ich finde arr.find(&:not_nil?)
etwas lesbarer alsarr.find { |e| !e.nil? }
.
Die Methode, die ich gefunden habe, ist Object#itself
. In meiner Verwendung wollte ich den Wert in einem Hash für den Schlüssel finden name
, wobei dieser Schlüssel in einigen Fällen versehentlich als groß geschrieben wurde Name
. Dieser Einzeiler ist wie folgt:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Wie in anderen Antworten erwähnt , schlägt dies in Fällen, in denen Sie einen Booleschen Wert testen, spektakulär fehl.
my_hash.values_at("Name", "name").find
?
map
, die ich der Einfachheit halber in diesem Beispiel entfernt habe. Wie hier geschrieben, ist sie austauschbar mit values_at
. Der wichtige Teil ist, was weitergegeben wird find
.
present?
erfordert eine nicht leere Zeichenfolge.! "".nil?
gibt true zurück, gibt aber"".present?
false zurück.