Sepertinya saya tidak dapat menemukan jawaban yang pasti tentang ini dan saya ingin memastikan saya memahami ini ke "tingkat ke-n" :-)
a = {"a" => "Hello", "b" => "World"} a.count # 2 ukuran # 2 panjang # 2 a = [10, 20] a.count # 2 ukuran # 2 panjang # 2
Jadi mana yang harus digunakan? Jika saya ingin tahu apakah a memiliki lebih dari satu elemen maka sepertinya tidak masalah tetapi saya ingin memastikan saya memahami perbedaan yang sebenarnya. Ini berlaku untuk array juga. Saya mendapatkan hasil yang sama.
Juga, saya menyadari bahwa jumlah / ukuran / panjang memiliki arti yang berbeda dengan ActiveRecord. Saya sebagian besar tertarik pada Ruby murni (1,92) sekarang tetapi jika ada yang ingin berpadu pada perbedaan AR membuat itu akan dihargai juga.
Terima kasih!
ruby
activerecord
size
content-length
cbmeeks
sumber
sumber
Array#nitems
:, yang mengembalikan jumlah item non-NIL dalam array. Tapi itu tidak tersedia di Ruby 1.9 lagiJawaban:
Untuk array dan hash
size
adalah alias untuklength
. Mereka sinonim dan melakukan hal yang persis sama.count
lebih fleksibel - dapat mengambil elemen atau predikat dan hanya menghitung item yang cocok.Dalam kasus di mana Anda tidak memberikan parameter untuk menghitungnya pada dasarnya memiliki efek yang sama dengan panjang panggilan. Mungkin ada perbedaan kinerja.
Kita dapat melihat dari kode sumber untuk Array bahwa mereka melakukan hal yang persis sama. Berikut adalah kode C untuk implementasi
array.length
:Dan inilah bagian yang relevan dari implementasi
array.count
:Kode untuk
array.count
melakukan beberapa pemeriksaan tambahan namun pada akhirnya panggilan kode yang sama persis:LONG2NUM(RARRAY_LEN(ary))
.Hash ( kode sumber ) di sisi lain tampaknya tidak mengimplementasikan versi dioptimalkan mereka sendiri
count
sehingga implementasi dariEnumerable
( kode sumber ) digunakan, yang iterates atas semua elemen dan menghitungnya satu per satu.Secara umum saya akan menyarankan menggunakan
length
(atau aliassize
) daripadacount
jika Anda ingin tahu berapa banyak elemen yang ada.Mengenai ActiveRecord, di sisi lain, ada yang perbedaan penting. lihat posting ini:
sumber
Ada perbedaan penting untuk aplikasi yang memanfaatkan koneksi basis data.
Ketika Anda menggunakan banyak ORM (ActiveRecord, DataMapper, dll.) Pemahaman umum adalah bahwa .size akan menghasilkan permintaan yang meminta semua item dari database ('pilih * dari mytable') dan kemudian memberi Anda jumlah item dihasilkan, sedangkan .count akan menghasilkan satu permintaan ('pilih hitungan (*) dari mytable') yang jauh lebih cepat.
Karena ORM ini sangat lazim saya mengikuti prinsip paling tidak heran. Secara umum jika saya sudah memiliki sesuatu di memori, maka saya menggunakan .size, dan jika kode saya akan menghasilkan permintaan ke database (atau layanan eksternal melalui API) saya menggunakan .count.
sumber
counter_cache
. Jika memiliki tabel,,foo
dan has_manybar
, Anda akan memiliki kolom denganfoo
namabars_count
yang diperbarui kapan saja abar
dibuat / dihancurkan. Menggunakanfoo.bars.size
adalah apa yang memeriksa kolom itu (tanpa benar-benar bertanyabars
).foo.bars.count
melakukan permintaan aktual, yang akan mengalahkan tujuan cache.Dalam kebanyakan kasus (misalnya Array atau String )
size
adalah alias untuklength
.count
biasanya berasal dari Enumerable dan dapat mengambil blok predikat opsional. Jadienumerable.count {cond}
[kira-kira](enumerable.select {cond}).length
- tentu saja dapat mem-bypass struktur perantara karena hanya perlu hitungan predikat yang sesuai.Catatan: Saya tidak yakin apakah
count
memaksa evaluasi enumerasi jika blok tidak ditentukan atau jika terjadi hubungan pendek kelength
jika mungkin.Sunting (dan terima kasih atas jawaban Markus!):
count
Tanpa blok (setidaknya untuk Array) tidak memaksa evaluasi. Saya kira tanpa perilaku formal itu "terbuka" untuk implementasi lain, jika memaksakan evaluasi tanpa predikat bahkan benar-benar masuk akal.sumber
Saya menemukan answare yang bagus di http://blog.hasmanythrough.com/2008/2/27/count-length-size
Saya juga punya pengalaman pribadi:
sumber
Kami memiliki beberapa cara untuk mengetahui berapa banyak elemen dalam array seperti
.length
,.count
dan.size
. Namun, lebih baik menggunakanarray.size
daripadaarray.count
. Karena.size
kinerjanya lebih baik.sumber
Menambahkan lebih banyak ke jawaban Mark Byers. Di Ruby metode
array.size
ini adalah alias untuk metode panjang # Array . Tidak ada perbedaan teknis dalam menggunakan salah satu dari kedua metode ini. Mungkin Anda tidak akan melihat perbedaan dalam kinerja juga. Namun,array.count
juga melakukan pekerjaan yang sama tetapi dengan beberapa fungsionalitas tambahan # jumlah hitunganDapat digunakan untuk mendapatkan total no elemen berdasarkan kondisi tertentu. Hitung dapat dipanggil dengan tiga cara:
Array # count # Mengembalikan jumlah elemen dalam Array
Array # count n # Mengembalikan jumlah elemen yang memiliki nilai n dalam Array
Array # count {| i | i.even?} Pengembalian dihitung berdasarkan kondisi yang dilakukan pada setiap array elemen
Di sini ketiga metode melakukan pekerjaan yang sama. Namun di sinilah
count
semakin menarik.Katakanlah, saya ingin menemukan berapa banyak elemen array yang berisi array dengan nilai 2
Array memiliki total tiga elemen dengan nilai 2.
Sekarang, saya ingin menemukan semua elemen array yang lebih besar dari 4
Array memiliki total 6 elemen yang> dari 4.
Saya harap ini memberikan beberapa info tentang
count
metode.sumber