Powiedzmy, że mam tablicę Ruby
a = [1, 2, 3, 4]
Jeśli chcę wszystko oprócz pierwszej, mogę napisać a.drop(1)
, co jest świetne. Jeśli jednak chcę wszystko oprócz ostatniego , mogę myśleć tylko w ten sposób
a[0..-2] # or
a[0...-1]
ale żaden z nich nie wydaje się tak czysty jak używanie drop
. Brakuje mi jakichś innych wbudowanych sposobów?
Odpowiedzi:
Być może...
lub
lub
lub
co zwróci ostatnią i pozostawi tablicę ze wszystkim przed nią
lub spraw, aby komputer działał na obiad:
lub
źródło
Array
wydaje mi się najlepszym podejściem. Większość projektów kończy się nacore_ext.rb
pliku z małymi rozszerzeniami, takimi jak ten. Niektóre biblioteki są praktycznie wszystkimi takimi rozszerzeniami:ActiveSupport
na przykład.clip
metodę społeczności Ruby? Naprawdę uważam, że to powinno tam być, a łatanie małp jest niewłaściwą rzeczą .a.reverse.drop(1).reverse
strategia. ;-)Z ciekawości, dlaczego nie lubisz
a[0...-1]
? Chcesz uzyskać wycinek tablicy, więc operator wycinka wydaje się idiomatycznym wyborem.Ale jeśli chcesz wywoływać to wszędzie, zawsze masz możliwość dodania metody o bardziej przyjaznej nazwie do klasy Array, jak zasugerował DigitalRoss. Może tak:
źródło
drop_last
....
?nil
:[][1..-1]
->nil
,[][0...-1]
->[]
Kolejna fajna sztuczka
źródło
a, *b = [1,2,3]
by spójrzmy na tablicy w klasycznym samochód / CDR mody.Jeśli chcesz wykonać
pop()
operację na tablicy (co spowoduje usunięcie ostatniego elementu), ale jesteś zainteresowany uzyskaniem tablicy zamiast elementu wyskakującego, możesz użyćtap(&:pop)
:źródło
Robię to tak:
źródło
A co powiesz na rozszerzenie samej metody upuszczania, na przykład w ten sposób?
Następnie możesz użyć rozmiaru ujemnego, aby usunąć elementy z końca, na przykład:
źródło
a[0...-1]
wydaje się najlepszym sposobem. Składnia wycinania tablic została stworzona właśnie w tym celu ...Alternatywnie, jeśli nie masz nic przeciwko modyfikowaniu tablicy w miejscu, możesz po prostu wywołać
a.pop
:źródło
b = a.pop
Pozbyć się ostatniego elementu w jednej linii, a reszta wraca
Ale naprawdę,
źródło
To jest sposób:
Ale wyjaśnijmy, jak to działa:
Następny przykład zwróci wszystkie rekordy, od pozycji 0 do ostatniej
Następny przykład zwróci rekordy od 1 pozycji do ostatniej
I tutaj masz to, czego potrzebujesz. Następny przykład zwróci rekordy od pozycji 0 do ostatniej-1
źródło
-2
zamiast tego pisać-1-1
.a[0...-1]
(zwróć uwagę na trzecią kropkę) i uzyskać ten sam wynik, coa[0..-1-1]
, ponieważ trzecia kropka mówi jej, aby wykluczyć element końcowy. Zobacz to, aby uzyskać więcej informacji.Czy próbowałeś „wziąć”
źródło
a.take(a.size - 1)
; tak, rozważałem tę opcję.Odpowiedź:
a.τwτ
ale najpierw musisz zainstalować Pypera ...Pyper intro: Czy znasz Lispy
car
i zwracaszcdr
„pierwszy” i „reszta” tablicy? Tylko dla potrzeb takich jak Twoje, stworzyłem rozszerzenie tego mechanizmu Lispy. Nazywa siępyper
i pozwala na dostęp również do 2, reszta od 2, 3, reszta z 3d, a także ostatnia, wszystko oprócz ostatniego itp. Nie byłoby o czym pisać, ale pozwala również na składanie liter, tak jakcaar
,cadr
,cdadar
itd. wiadomo od Lispie:i na koniec odpowiedź na Twoje pytanie:
Jest więcej:
Kompozycje:
Istnieje również więcej znaków niż tylko polecenie
a..f
,u..z
i0..9
, przede wszystkimm
, czyli mapa:Ale inne postacie poleceń są w tej chwili zbyt gorące i niezbyt łatwe w użyciu.
źródło
To tworzy nową tablicę zawierającą wszystkie elementy oryginału oprócz ostatnich:
Zwróć uwagę, że kilka innych osób zasugerowało użycie #pop. Jeśli możesz modyfikować tablicę w miejscu, w porządku. Jeśli nie jesteś z tym w porządku, najpierw duplikuj tablicę, jak w tym przykładzie.
źródło
Często okazuje się, że chcę mieć wszystkie elementy tablicy oprócz ostatnich n. Skonfigurowałem własną funkcję, aby robić to w sposób, który uważam za bardziej czytelny niż inne rozwiązania:
Teraz możesz wykonać następujące czynności:
Celowo dopuściłem ArgumentError, aby wywołujący był odpowiedzialny za sposób, w jaki używają tej metody. Chciałbym usłyszeć komentarze / krytykę tego podejścia.
źródło
źródło