Indeks wycinka łańcucha Ruby: str [n..infinity]

84

Łatwe pytanie, ale nie mogłem go znaleźć w dokumencie.

Jak pokroić ciąg lub tablicę od nzawsze?

>> 'Austin'[1..3]
=> "ust"
>> 'Austin'[1..]
SyntaxError: compile error
(irb):2: syntax error, unexpected ']'
    from (irb):2
Austin Richardson
źródło
1
Ten ostatni będzie działał z Rubim 2.6 i prawdopodobnie stanie się sposobem na osiągnięcie tego celu przez Railsy - zobacz tutaj, aby uzyskać więcej informacji .
SRack

Odpowiedzi:

165

Użyj odwrotnego indeksowania:

[1..-1]

Element w Rubim (i kilku innych językach) ma prosty indeks i „odwrócony”. Tak więc łańcuch o długości nma 0..(n-1)i dodatkowe (-n)..-1indeksy, ale nic więcej - nie możesz używać >=nani <-nindeksów.

  'i' 'n'|'A' 'u' 's' 't' 'i' 'n'|'A' 'u' 's' 't' 'i' 'n'|'A' 'u' 's'
  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7   8 
<- error |                you can use this               | error ->
Nakilon
źródło
2
Dobra ilustracja, jednak użycie przez ciebie "ważnych" liter (tj. Tych, które istnieją w ciągu) jest moim zdaniem nieco mylące, ponieważ dane poza jego granicami są naprawdę nieokreślone. To może być wszystko, łącznie ze znakami niebędącymi postaciami. W każdym razie +1 za tak dobrze wyjaśnioną odpowiedź :-)
Topher Fangio
19

Użyj 1 :-)

'Austin'[1..-1] # => "ustin"
Topher Fangio
źródło
10

Całkiem eleganckie, używając nieskończonego zakresu wprowadzonego w Ruby 2.6:

string = 'Austin'
string[1..] # => ustin

Mam nadzieję, że to dla kogoś przydatne. Obcina kilka znaków z najlepszego podejścia do tej pory i będzie bardzo czytelny, gdy niekończące się zakresy będą regularnie stosowane.

SRack
źródło
3

Jeśli przypiszesz ciąg do zmiennej, możesz użyć długości / rozmiaru

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
Jason Noble
źródło