Ich kann anscheinend keine endgültige Antwort darauf finden und möchte sicherstellen, dass ich dies bis zur "n-ten Ebene" verstehe :-)
a = {"a" => "Hallo", "b" => "Welt"} a.count # 2 a.size # 2 a.Länge # 2 a = [10, 20] a.count # 2 a.size # 2 a.Länge # 2
Also welche verwenden? Wenn ich wissen möchte, ob a mehr als ein Element hat, scheint es keine Rolle zu spielen, aber ich möchte sicherstellen, dass ich den wirklichen Unterschied verstehe. Dies gilt auch für Arrays. Ich bekomme die gleichen Ergebnisse.
Außerdem ist mir klar, dass Anzahl / Größe / Länge mit ActiveRecord unterschiedliche Bedeutungen haben. Ich interessiere mich momentan hauptsächlich für reinen Ruby (1.92), aber wenn jemand den Unterschied, den AR macht, mitmachen möchte, wäre das auch sehr willkommen.
Vielen Dank!
ruby
activerecord
size
content-length
cbmeeks
quelle
quelle
Array#nitems
Diese gibt die Anzahl der Nicht-NIL-Elemente in einem Array zurück. Aber das ist nicht mehr in Ruby 1.9 verfügbarAntworten:
Für Arrays und Hashes
size
ist ein Alias fürlength
. Sie sind Synonyme und machen genau das Gleiche.count
ist vielseitiger - es kann ein Element oder Prädikat aufnehmen und nur die übereinstimmenden Elemente zählen.Wenn Sie keinen Parameter zum Zählen angeben, hat dies im Grunde den gleichen Effekt wie die Aufruflänge. Es kann jedoch einen Leistungsunterschied geben.
Wir können dem Quellcode für Array entnehmen, dass sie fast genau dasselbe tun. Hier ist der C-Code für die Implementierung von
array.length
:Und hier ist der relevante Teil aus der Implementierung von
array.count
:Der Code für
array.count
führt einige zusätzliche Überprüfungen durch, ruft jedoch am Ende genau denselben Code auf :LONG2NUM(RARRAY_LEN(ary))
.Hashes ( Quellcode ) hingegen scheinen keine eigene optimierte Version von zu implementieren,
count
daher wird die Implementierung vonEnumerable
( Quellcode ) verwendet, die alle Elemente durchläuft und sie einzeln zählt.Im Allgemeinen würde ich empfehlen,
length
(oder seinen Alias) zu verwendensize
) zu verwenden, anstattcount
zu wissen, wie viele Elemente es insgesamt gibt.In Bezug auf ActiveRecord gibt es dagegen wichtige Unterschiede. Schauen Sie sich diesen Beitrag an:
quelle
Es gibt einen entscheidenden Unterschied für Anwendungen, die Datenbankverbindungen verwenden.
Wenn Sie viele ORMs (ActiveRecord, DataMapper usw.) verwenden, wird allgemein verstanden, dass .size eine Abfrage generiert, die alle Elemente aus der Datenbank anfordert ('select * from mytable') und Ihnen dann die Anzahl der Elemente angibt Dies führt dazu, dass .count eine einzelne Abfrage generiert ('select count (*) from mytable'), die erheblich schneller ist.
Weil diese ORMs so weit verbreitet sind, folge ich dem Prinzip des geringsten Erstaunens. Wenn ich bereits etwas im Speicher habe, verwende ich im Allgemeinen .size. Wenn mein Code eine Anforderung an eine Datenbank (oder einen externen Dienst über eine API) generiert, verwende ich .count.
quelle
counter_cache
. Wenn Sie eine Tabelle habenfoo
und has_manybar
, haben Sie eine Spalte mit demfoo
Namenbars_count
, die jedes Mal aktualisiert wird, wenn einebar
erstellt / zerstört wird. Mitfoo.bars.size
wird diese Spalte überprüft (ohne tatsächlich eine abzufragenbars
).foo.bars.count
führt die eigentliche Abfrage aus, die den Zweck des Caches zunichte machen würde.In den meisten Fällen (z. B. Array oder String )
size
ist ein Alias fürlength
.count
kommt normalerweise von Enumerable und kann einen optionalen Prädikatblock annehmen. Soenumerable.count {cond}
ist [ungefähr](enumerable.select {cond}).length
- es kann natürlich die Zwischenstruktur umgehen, da es nur die Anzahl der übereinstimmenden Prädikate benötigt.Hinweis: Ich bin nicht sicher , ob
count
Kräfte eine Auswertung der Zählung , wenn der Block nicht angegeben ist oder wenn es um Kurzschlüsse zu dem ,length
wenn möglich.Bearbeiten (und dank Marks Antwort!):
count
Ohne Block (zumindest für Arrays) wird keine Auswertung erzwungen. Ich nehme an, ohne formales Verhalten ist es "offen" für andere Implementierungen, wenn das Erzwingen einer Bewertung ohne Prädikat überhaupt Sinn macht.quelle
Ich habe eine gute Antwort unter http://blog.hasmanythrough.com/2008/2/27/count-length-size gefunden
Auch ich habe eine persönliche Erfahrung:
quelle
Wir haben eine mehr Möglichkeiten , um herauszufinden , wie viele Elemente in einem Array wie
.length
,.count
und.size
. Es ist jedoch besser zu verwendenarray.size
alsarray.count
. Weil die.size
Leistung besser ist.quelle
Hinzufügen von mehr zu Mark Byers Antwort. In Ruby ist die Methode
array.size
ein Alias für die Array # -Längenmethode. Es gibt keinen technischen Unterschied bei der Verwendung einer dieser beiden Methoden. Möglicherweise sehen Sie auch keinen Leistungsunterschied. Dasarray.count
macht aber auch den gleichen Job, aber mit einigen zusätzlichen Funktionen Array # countEs kann verwendet werden, um die Gesamtzahl der Elemente basierend auf einer bestimmten Bedingung zu ermitteln. Count kann auf drei Arten aufgerufen werden:
Array # count # Gibt die Anzahl der Elemente im Array zurück
Array # count n # Gibt die Anzahl der Elemente mit dem Wert n im Array zurück
Array # count {| i | i.even?} Gibt die Anzahl basierend auf der Bedingung zurück, die für jedes Elementarray aufgerufen wurde
Hier machen alle drei Methoden den gleichen Job. Hier wird das allerdings
count
interessant.Angenommen, ich möchte herausfinden, wie viele Array-Elemente das Array mit dem Wert 2 enthält
Das Array besteht aus insgesamt drei Elementen mit dem Wert 2.
Jetzt möchte ich alle Array-Elemente größer als 4 finden
Das Array hat insgesamt 6 Elemente, die> als 4 sind.
Ich hoffe, es gibt einige Informationen über die
count
Methode.quelle