Antworten:
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).
present?
Methode.
#present?
ist nur für Rails. In reinem Ruby bekommst du NoMethodError: undefined method 'present?' for Array
.
require 'activesupport'
.
true
oder leer ist.Die Methode empty?
stammt aus der Array-Klasse
http://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
und false
.
>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false
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 sind none?
, all?
und one?
, 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
>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true
Fall 2
>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false
Fall 3
>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false
Wenn Sie der Anweisung ein Ausrufezeichen voranstellen, erfahren Sie, ob das Array nicht leer ist. Also in deinem Fall -
a = [1,2,3]
!a.empty?
=> true
Vermeiden Sie any?
große Arrays.
any?
ist O(n)
empty?
ist O(1)
any?
überprüft nicht die Länge, sondern durchsucht das gesamte Array nach wahrheitsgemäßen Elementen.
static VALUE
rb_ary_any_p(VALUE ary)
{
long i, len = RARRAY_LEN(ary);
const VALUE *ptr = RARRAY_CONST_PTR(ary);
if (!len) return Qfalse;
if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue;
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
}
}
return Qfalse;
}
empty?
Auf der anderen Seite wird nur die Länge des Arrays überprüft.
static VALUE
rb_ary_empty_p(VALUE ary)
{
if (RARRAY_LEN(ary) == 0)
return Qtrue;
return Qfalse;
}
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.
nil
Werten beginnen, wobei "normale" Arrays any?
ohne Blockrückgabe beim ersten Element vorhanden sind, sodass die Komplexität wie bei der empty?
Methode
Ich werde vorschlagen, zu verwenden unless
und blank
zu überprüfen, ob leer ist oder nicht.
Beispiel:
unless a.blank?
a = "Is not empty"
end
Dies wird 'a' leer wissen oder nicht. Wenn 'a' leer ist, wird der folgende Code nicht ausgeführt.
#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 hat size > 0
. In diesem Fall würde diese absolut einfache Erweiterung (NICHT optimiert, im Affenstil) Sie näher bringen.
Object.class_eval do
def size?
respond_to?(:size) && size > 0
end
end
> "foo".size?
=> true
> "".size?
=> false
> " ".size?
=> true
> [].size?
=> false
> [11,22].size?
=> true
> [nil].size?
=> true
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 der present?
Fall ist).length?
für String
oder andere Typen, bei denen er möglicherweise aussagekräftiger ist.Integer
und andere Numeric
Typen benutzerdefinieren , damit eine logische Null zurückgegeben wird false
.
empty?
?