Nie mogę znaleźć ostatecznej odpowiedzi w tej sprawie i chcę się upewnić, że rozumiem to do „n-tego poziomu” :-)
a = {"a" => "Witaj", "b" => "Świat"} a. liczba # 2 a. rozmiar # 2 a. długość # 2 a = [10, 20] a. liczba # 2 a. rozmiar # 2 a. długość # 2
Więc którego użyć? Jeśli chcę wiedzieć, czy a ma więcej niż jeden element, nie wydaje się to mieć znaczenia, ale chcę się upewnić, że rozumiem prawdziwą różnicę. Dotyczy to również tablic. Otrzymuję takie same wyniki.
Zdaję sobie również sprawę, że liczba / rozmiar / długość mają różne znaczenia w przypadku ActiveRecord. W tej chwili interesuje mnie przede wszystkim czysty Ruby (1,92), ale jeśli ktoś chciałby się pochwalić różnicą, jaką robi AR, byłoby to również wdzięczne.
Dzięki!
ruby
activerecord
size
content-length
cbmeeks
źródło
źródło
Array#nitems
która zwraca liczbę elementów innych niż NIL w tablicy. Ale to nie jest już dostępne w Ruby 1.9Odpowiedzi:
Dla tablic i skrótów
size
jest aliasem dlalength
. Są synonimami i robią dokładnie to samo.count
jest bardziej wszechstronny - może przyjąć element lub predykat i liczyć tylko te elementy, które pasują.W przypadku, gdy nie podasz parametru do zliczenia, ma on zasadniczo taki sam efekt jak wywołanie length. Jednak może występować różnica w wydajności.
Z kodu źródłowego Array widać , że robią prawie dokładnie to samo. Oto kod C do implementacji
array.length
:A oto odpowiednia część z realizacji
array.count
:Kod dla
array.count
wykonuje kilka dodatkowych kontroli, ale w końcu nazywa dokładnie ten sam kod:LONG2NUM(RARRAY_LEN(ary))
.Z drugiej strony hashe ( kod źródłowy ) nie wydają się implementować własnej zoptymalizowanej wersji,
count
więc używana jest implementacja fromEnumerable
( kod źródłowy ), która iteruje po wszystkich elementach i zlicza je jeden po drugim.Ogólnie radziłbym raczej używać
length
(lub jego aliasusize
) niżcount
wiedzieć, ile elementów jest w sumie.Odnośnie ActiveRecord, z drugiej strony, nie są istotne różnice. sprawdź ten post:
źródło
Istnieje zasadnicza różnica w przypadku aplikacji korzystających z połączeń z bazą danych.
Kiedy używasz wielu ORMów (ActiveRecord, DataMapper itp.), Ogólne zrozumienie jest takie, że .size wygeneruje zapytanie, które zażąda wszystkich pozycji z bazy danych („select * from mytable”), a następnie poda liczbę elementów wynikowe, podczas gdy .count wygeneruje pojedyncze zapytanie ('select count (*) from mytable'), co jest znacznie szybsze.
Ponieważ te ORMy są tak powszechne, kieruję się zasadą najmniejszego zdziwienia. Generalnie, jeśli mam już coś w pamięci, to używam .size, a jeśli mój kod wygeneruje żądanie do bazy danych (lub usługi zewnętrznej przez API) używam .count.
źródło
counter_cache
. Jeśli masz tabelęfoo
i ma_manybar
, będziesz mieć kolumnę wfoo
named,bars_count
która będzie aktualizowana za każdym razem, gdybar
zostanie utworzona / zniszczona. Używaniefoo.bars.size
jest tym, co sprawdza tę kolumnę (bez odpytywania żadnejbars
).foo.bars.count
wykonuje rzeczywiste zapytanie, co podważyłoby cel pamięci podręcznej.W większości przypadków (np. Array lub String )
size
jest aliasem dlalength
.count
zwykle pochodzi z Enumerable i może przyjmować opcjonalny blok predykatu. Tak więcenumerable.count {cond}
jest [z grubsza](enumerable.select {cond}).length
- może oczywiście ominąć strukturę pośrednią, ponieważ potrzebuje tylko liczby pasujących predykatów.Uwaga: Nie jestem pewien, czy
count
wymusza ocenę wyliczenia, jeśli blok nie jest określony lub jeśli powoduje zwarcie do,length
jeśli to możliwe.Edycja (i dzięki odpowiedzi Marka!):
count
Bez bloku (przynajmniej dla tablic) nie wymusza oceny. Przypuszczam, że bez formalnego zachowania jest „otwarty” na inne implementacje, jeśli wymuszenie oceny bez predykatu w ogóle ma sens.źródło
Znalazłem dobre oprogramowanie answare pod adresem http://blog.hasmanythrough.com/2008/2/27/count-length-size
Mam też osobiste doświadczenie:
źródło
Istnieje kilka sposobów, aby dowiedzieć się, ile elementów w tablicy, na przykład
.length
,.count
i.size
. Jednak lepiej jest używaćarray.size
zamiastarray.count
. Ponieważ.size
ma lepszą wydajność.źródło
Dodawanie więcej do odpowiedzi Mark Byers. W Rubim metoda
array.size
jest aliasem do metody Array # length . Nie ma technicznej różnicy w stosowaniu którejkolwiek z tych dwóch metod. Możliwe, że nie zobaczysz również różnicy w wydajności. Jednakarray.count
również wykonuje to samo zadanie, ale z kilkoma dodatkowymi funkcjami Liczba tablic #Można go użyć do uzyskania całkowitej liczby elementów w oparciu o pewien warunek. Count można wywołać na trzy sposoby:
Array # count # Zwraca liczbę elementów w tablicy
Array # count n # Zwraca liczbę elementów o wartości n w Array
Tablica # count {| i | i.even?} Zwraca liczbę na podstawie warunku wywołanego dla każdej tablicy elementów
Tutaj wszystkie trzy metody wykonują tę samą pracę. Jednak tutaj
count
robi się interesująco.Powiedzmy, że chcę sprawdzić, ile elementów tablicy zawiera tablica o wartości 2
Tablica zawiera łącznie trzy elementy o wartości 2.
Teraz chcę znaleźć wszystkie elementy tablicy większe niż 4
Tablica ma łącznie 6 elementów, które są> 4.
Mam nadzieję, że daje trochę informacji o
count
metodzie.źródło