Jest nawet znacznie szybszy (prawie 40% w metodzie huku) niż najlepsza odpowiedź. Oto wynik tego samego testu porównawczego:
user system total real
chomp 0.9498230.0010250.950848(0.951941)
range 1.8742370.0014721.875709(1.876820)
delete_suffix 0.7216990.0009450.722644(0.723410)
delete_suffix!0.6500420.0007140.650756(0.651332)
Mam nadzieję, że jest to przydatne - zwróć uwagę, że metoda nie akceptuje obecnie wyrażenia regularnego, więc jeśli nie znasz sufiksu, na razie nie jest to wykonalne. Ponieważ jednak zaakceptowana odpowiedź ( aktualizacja: w momencie pisania ) narzuca to samo, pomyślałem, że może to być przydatne dla niektórych osób.
@JPSilvashy Nigdy nie byłem bardziej zadowolony z utraty znacznika wyboru. To świetna odpowiedź.
Wayne Conrad
1
To świetna i szybka funkcja, ale nie jest to właściwa odpowiedź, ponieważ nie odpowiada dokładnie na pytanieWhat is the preferred way of removing the last n characters from a string?
Sam
1
Dzięki za opinie @Sam - na to pytanie odpowiedź brzmiała przez prawie dziewięć lat, która działała tak samo jak ta, z 261 głosami pozytywnymi w momencie pisania. JP zaakceptował to i ostatnio przeszedł na to, więc powiedziałbym, że odpowiedział na ich pytanie :) Pomyślałem, że poddam to jako nowoczesną alternatywę i mam nadzieję, że pomoże to ludziom, którzy tu wylądują. W rzeczywistości omówiłem to wszystko w pytaniu - mam nadzieję, że ta metoda wkrótce zaakceptuje wyrażenie regularne, chociaż poniżej znajduje się idealna alternatywa dla twojego przypadku.
Zauważ, że działa to tylko w Ruby 1.9. W Ruby 1.8 spowoduje to usunięcie ostatnich bajtów , a nie ostatnich znaków .
Jörg W Mittag
2
Ale prawdopodobnie miał na myśli „bajty”, jeśli używa 1.8.x.
DigitalRoss
4
To działa, ale uważam, że „abc123”. Chomp („123”) jest dwa razy szybszy zarówno dla krótkich, jak i bardzo długich łańcuchów. (Ruby 2.0.0-p247) Czy ktoś może to potwierdzić?
Plasmarob
10
Dla tych, którzy zastanawiają się, dlaczego ten konkretny przykład nie działa .. są 3 kropki, a nie 2, tj. [0...-4]Nie[0..-4]
rorofromfrance
2
@Plamarob Myślę, że bardziej istotne jest stwierdzenie, że chomp jest o 53 nanosekundy szybszy niż stwierdzenie, że jest dwa razy szybszy. Następnie możesz lepiej oszacować koszt w porównaniu do wartości korzystania z niego i czy warto zoptymalizować go w danej sytuacji.
cesoid
266
Jeśli znaki, które chcesz usunąć, są zawsze tymi samymi znakami, zastanów się chomp:
'abc123'.chomp('123')# => "abc"
Zalety chomp: brak liczenia, a kod jaśniej komunikuje, co robi.
Bez argumentów chompusuwa końcówkę wiersza DOS lub Unix, jeśli występuje:
W komentarzach pojawiło się pytanie o szybkość używania w #chompporównaniu z użyciem zakresu. Oto test porównawczy dwóch:
require 'benchmark'
S ='asdfghjkl'
SL = S.length
T =10_000
A =1_000.times.map {|n|"#{n}#{S}"}
GC.disable
Benchmark.bmbm do|x|
x.report('chomp'){ T.times { A.each {|s| s.chomp(S)}}}
x.report('range'){ T.times { A.each {|s| s[0...-SL]}}}end
Wyniki testu (przy użyciu CRuby 2.13p242):
Rehearsal-----------------------------------------
chomp 1.5400000.0400001.580000(1.587908)
range 1.8100000.2000002.010000(2.011846)-------------------------------- total:3.590000sec
user system total real
chomp 1.5500000.0700001.620000(1.610362)
range 1.9700000.1700002.140000(2.146682)
Więc chomp jest szybszy niż użycie zakresu, o ~ 22%.
Chop jest również opcją. To mniej wybredne, co zostanie usunięte.
Andrew Grimm,
1
Przekonałem się, że tak naprawdę jest odwrotnie. W rzeczywistości .chomp wydaje się być dwa razy szybszy.
Plasmarob
3
@Plamarob, Benchmarki w Ruby są często zaskakujące. Tak często się mylę, że nie próbuję już zgadywać, co będzie szybsze. Ponadto, jeśli odpowiedź zostanie poprawiona przez wyniki testu porównawczego, możesz ją edytować.
Wayne Conrad
1
Jeśli dobrze czytam kod, zasięg zajmuje około 53 nanosekund dłużej niż chomp. W niektórych sytuacjach może to być znaczny opór, ale pamiętanie o absolutnej prędkości (a nie tylko względnej) może powiedzieć ci, czy powinieneś przejść przez bazę kodu i zmienić wszystkie zakresy w chomps (jeśli dotyczy). Prawdopodobnie nie.
cesoid
1
Działa świetnie. I możesz użyć, chomp!()aby działać na ciąg w miejscu.
Zauważ, że działa to tylko w Ruby 1.9. W Ruby 1.8 spowoduje to usunięcie ostatnich bajtów , a nie ostatnich znaków .
Jörg W Mittag
5
Jest to lepsze niż wybrana odpowiedź, ponieważ 3 kropki (...) są łatwiejsze do zapamiętania, ponieważ -n oznacza usunięcie n znaków z końca łańcucha.
lulalala,
również „abcd” [0 ..- 2] # => „abc”, podczas gdy „abcd” [0 ...- 2] # => „ab”. Moim zdaniem opcja zakresu 3 kropek daje bardziej zrozumiały kod.
mokagio
31
sugerowałbym chop . Myślę, że wspomniano o tym w jednym z komentarzy, ale bez linków ani wyjaśnień, dlatego uważam, że lepiej:
Usuwa po prostu ostatni znak z łańcucha i nie musisz określać żadnych wartości, aby tak się stało.
Jeśli chcesz usunąć więcej niż jedną postać, chompto najlepszy wybór. Oto, co mają do powiedzenia rubinowi doktorzychop :
Zwraca nowy ciąg z usuniętym ostatnim znakiem. Jeśli ciąg kończy się na \ r \ n, oba znaki są usuwane. Zastosowanie chop do pustego ciągu zwraca pusty ciąg. Ciąg # chomp jest często bezpieczniejszą alternatywą, ponieważ pozostawia ciąg bez zmian, jeśli nie kończy się separatorem rekordów.
Chociaż jest to używane głównie do usuwania separatorów, takich jak \r\nja użyłem go do usunięcia ostatniego znaku z prostego ciągu, na przykład, saby słowo było liczbą pojedynczą.
Czy to jest wydajne? Wydaje się, że warto porównać wyniki z innymi odpowiedziami :)
SRack
16
Usunięcie ostatnich nznaków jest tym samym, co zachowanie pierwszych length - nznaków.
Aktywne wsparcie obejmuje String#firsti String#lastmetody, które zapewniają wygodny sposób na zachowanie lub upuszczenie pierwszych / ostatnich nznaków:
delete_suffix
Ruby 2.5. Więcej informacji tutaj .Odpowiedzi:
Ruby 2.5+
Jako Ruby 2.5 można wykorzystać
delete_suffix
albodelete_suffix!
do osiągnięcia tego celu w sposób szybki i czytelny sposób.Dokumenty dotyczące metod są tutaj .
Jeśli wiesz, co to jest przyrostek, jest to idiomatyczne (i argumentowałbym, nawet bardziej czytelne niż inne odpowiedzi tutaj):
Jest nawet znacznie szybszy (prawie 40% w metodzie huku) niż najlepsza odpowiedź. Oto wynik tego samego testu porównawczego:
Mam nadzieję, że jest to przydatne - zwróć uwagę, że metoda nie akceptuje obecnie wyrażenia regularnego, więc jeśli nie znasz sufiksu, na razie nie jest to wykonalne. Ponieważ jednak zaakceptowana odpowiedź ( aktualizacja: w momencie pisania ) narzuca to samo, pomyślałem, że może to być przydatne dla niektórych osób.
źródło
What is the preferred way of removing the last n characters from a string?
źródło
[0...-4]
Nie[0..-4]
Jeśli znaki, które chcesz usunąć, są zawsze tymi samymi znakami, zastanów się
chomp
:Zalety
chomp
: brak liczenia, a kod jaśniej komunikuje, co robi.Bez argumentów
chomp
usuwa końcówkę wiersza DOS lub Unix, jeśli występuje:W komentarzach pojawiło się pytanie o szybkość używania w
#chomp
porównaniu z użyciem zakresu. Oto test porównawczy dwóch:Wyniki testu (przy użyciu CRuby 2.13p242):
Więc chomp jest szybszy niż użycie zakresu, o ~ 22%.
źródło
chomp!()
aby działać na ciąg w miejscu.źródło
sugerowałbym
chop
. Myślę, że wspomniano o tym w jednym z komentarzy, ale bez linków ani wyjaśnień, dlatego uważam, że lepiej:Usuwa po prostu ostatni znak z łańcucha i nie musisz określać żadnych wartości, aby tak się stało.
Jeśli chcesz usunąć więcej niż jedną postać,
chomp
to najlepszy wybór. Oto, co mają do powiedzenia rubinowi doktorzychop
:Chociaż jest to używane głównie do usuwania separatorów, takich jak
\r\n
ja użyłem go do usunięcia ostatniego znaku z prostego ciągu, na przykład,s
aby słowo było liczbą pojedynczą.źródło
Tutaj w konsoli:
źródło
Usunięcie ostatnich
n
znaków jest tym samym, co zachowanie pierwszychlength - n
znaków.Aktywne wsparcie obejmuje
String#first
iString#last
metody, które zapewniają wygodny sposób na zachowanie lub upuszczenie pierwszych / ostatnichn
znaków:źródło
jeśli używasz szyn, spróbuj:
[EDYTOWANE]
Aby uzyskać ciąg BEZ ostatnich 2 znaków:
Uwaga: ostatni ciąg znaków ma wartość n-1. Tak więc, aby usunąć ostatnie 2, używamy n-3.
źródło
Zawsze możesz użyć czegoś takiego
Gdzie
X
jest liczba znaków do usunięcia.Lub z przypisaniem / wykorzystaniem wyniku:
gdzie
X
jest liczba znaków plus jeden do usunięcia.źródło
Sprawdź
slice()
metodę:http://ruby-doc.org/core-2.5.0/String.html#method-i-slice
źródło
Jeśli nie masz nic przeciwko tworzeniu metod klas i chcesz odciąć postacie, spróbuj tego:
źródło
Za pomocą wyrażenia regularnego:
źródło
Jeśli znaki, które chcesz usunąć, są zawsze tymi samymi znakami, rozważ chomp:
„abc123”. chomp („123”)
źródło
źródło