Ist es schlecht, mit der Methode zu überprüfen, ob ein Array nicht leer ist any?
?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
Oder ist es besser zu benutzen unless a.empty?
?
any?
ist nicht das gleiche wie not empty?
in einigen Fällen.
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
Aus der Dokumentation:
Wenn der Block nicht angegeben ist, fügt Ruby einen impliziten Block von {| obj | hinzu obj} (das ist einer? gibt true zurück, wenn mindestens eines der Sammlungsmitglieder nicht false oder nil ist).
empty?
?present?
Methode.#present?
ist nur für Rails. In reinem Ruby bekommst duNoMethodError: undefined method 'present?' for Array
.require 'activesupport'
.Der Unterschied zwischen einem Array, das seine Werte bewertet
true
oder leer ist.Die Methode
empty?
stammt aus der Array-Klassehttp://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
Es wird verwendet, um zu überprüfen, ob das Array etwas enthält oder nicht. Dies schließt Dinge ein, die bewertet werden
false
, wie z. B.nil
undfalse
.Die Methode
any?
stammt aus dem Enumerable-Modul.http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
Es wird verwendet, um zu bewerten, ob "irgendein" Wert im Array ausgewertet wird
true
. Ähnliche Methoden dazu sindnone?
,all?
undone?
, wo sie alle nur zu sehen , prüfen, wie oft wahr ausgewertet werden kann. Das hat nichts mit der Anzahl der in einem Array gefundenen Werte zu tun.Fall 1
Fall 2
Fall 3
quelle
Wenn Sie der Anweisung ein Ausrufezeichen voranstellen, erfahren Sie, ob das Array nicht leer ist. Also in deinem Fall -
quelle
Vermeiden Sie
any?
große Arrays.any?
istO(n)
empty?
istO(1)
any?
überprüft nicht die Länge, sondern durchsucht das gesamte Array nach wahrheitsgemäßen Elementen.empty?
Auf der anderen Seite wird nur die Länge des Arrays überprüft.Der Unterschied ist relevant, wenn Sie "spärliche" Arrays haben, die mit vielen
nil
Werten beginnen, wie zum Beispiel ein Array, das gerade erstellt wurde.quelle
nil
Werten beginnen, wobei "normale" Arraysany?
ohne Blockrückgabe beim ersten Element vorhanden sind, sodass die Komplexität wie bei derempty?
MethodeIch werde vorschlagen, zu verwenden
unless
undblank
zu überprüfen, ob leer ist oder nicht.Beispiel:
Dies wird 'a' leer wissen oder nicht. Wenn 'a' leer ist, wird der folgende Code nicht ausgeführt.
quelle
#blank?
ist Teil von Rails. Wenn sie bereits Rails verwenden,#present?
ist die Negation#blank?
sowieso.Ich denke nicht, dass es schlecht ist, es überhaupt zu benutzen
any?
. Ich benutze es oft. Es ist klar und prägnant.Wenn Sie jedoch besorgt sind, dass alle
nil
Werte es abwerfen, fragen Sie wirklich, ob das Array hatsize > 0
. In diesem Fall würde diese absolut einfache Erweiterung (NICHT optimiert, im Affenstil) Sie näher bringen.Dies ist ziemlich beschreibend und fragt logisch: "Hat dieses Objekt eine Größe?". Es ist prägnant und erfordert kein ActiveSupport. Und es ist einfach, darauf aufzubauen.
Einige Extras zum Nachdenken:
present?
bei ActiveSupport.String
, die Leerzeichen ignoriert (wie dies derpresent?
Fall ist).length?
fürString
oder andere Typen, bei denen er möglicherweise aussagekräftiger ist.Integer
und andereNumeric
Typen benutzerdefinieren , damit eine logische Null zurückgegeben wirdfalse
.quelle