Índice de segmento de cadena de rubí: str [n..infinity]

84

Pregunta fácil, pero no pude encontrarla en el documento.

¿Cómo corto una cadena o matriz de nhasta para siempre?

>> 'Austin'[1..3]
=> "ust"
>> 'Austin'[1..]
SyntaxError: compile error
(irb):2: syntax error, unexpected ']'
    from (irb):2
Austin Richardson
fuente
1
Este último funcionará desde Ruby 2.6 y probablemente se convertirá en la forma 'Railsy' de lograrlo; consulte aquí para obtener más información .
SRack el

Respuestas:

165

Utilice la indexación inversa:

[1..-1]

Un elemento en Ruby (y algunos otros lenguajes) tiene un índice directo y uno "invertido". Entonces, la cadena con longitud ntiene índices 0..(n-1)adicionales (-n)..-1, pero no más; no puede usar >=no <-níndices.

  '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
fuente
2
Buena ilustración, sin embargo, su uso de letras "válidas" (es decir, las que existen en la cadena) es un poco engañoso en mi opinión, ya que los datos fuera de los límites de la cadena son realmente indefinidos. Eso podría ser cualquier cosa, incluidos los no personajes. De todos modos, +1 para una respuesta tan bien explicada :-)
Topher Fangio
19

Usa 1 :-)

'Austin'[1..-1] # => "ustin"
Topher Fangio
fuente
10

Bastante elegante usando el rango infinito introducido en Ruby 2.6:

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

Espero que sea útil para alguien. Elimina un par de caracteres del mejor enfoque hasta ahora, y será muy legible una vez que se adopten regularmente rangos infinitos.

SRack
fuente
3

Si asigna la cadena a una variable, puede usar longitud / tamaño

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
Jason noble
fuente