Indice slice stringa Ruby: str [n..infinity]


86

Domanda facile, ma non sono riuscita a trovarla nel documento.

Come faccio a tagliare una stringa o un array da nfino a sempre?

>> 'Austin'[1..3]
=> "ust"
>> 'Austin'[1..]
SyntaxError: compile error
(irb):2: syntax error, unexpected ']'
    from (irb):2

1
Quest'ultimo funzionerà da Ruby 2.6 e probabilmente diventerà il modo "Railsy" per raggiungere questo obiettivo - vedi qui per maggiori informazioni .
Sack il

Risposte:


167

Usa l'indicizzazione inversa:

[1..-1]

Un elemento in Ruby (e in alcune altre lingue) ha un indice diretto e uno "invertito". Quindi, la stringa con lunghezza nha 0..(n-1)e (-n)..-1indici aggiuntivi , ma non di più: non puoi usare >=no <-nindici.

  '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 ->

2
Bella illustrazione, tuttavia, il tuo uso di lettere "valide" (cioè quelle esistenti nella stringa) è un po 'fuorviante a mio parere poiché i dati al di fuori dei limiti della stringa sono davvero indefiniti. Potrebbe essere qualsiasi cosa, compresi i non personaggi. Comunque, +1 per una risposta così ben spiegata :-)
Topher Fangio


10

Abbastanza elegante utilizzando la gamma infinita introdotta in Ruby 2.6:

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

Spero sia utile per qualcuno. Taglia un paio di caratteri dall'approccio migliore fino ad ora e sarà molto leggibile una volta che vengono regolarmente adottate gamme infinite.


3

Se assegni la stringa a una variabile, puoi utilizzare length / size

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.