Индекс фрагмента строки Ruby: str [n..infinity]

86

Простой вопрос, но не нашел его в документе.

Как нарезать строку или массив nнавсегда?

>> 'Austin'[1..3]
=> "ust"
>> 'Austin'[1..]
SyntaxError: compile error
(irb):2: syntax error, unexpected ']'
    from (irb):2
Остин Ричардсон
источник
1
Последний будет работать с Ruby 2.6 и, вероятно, станет «Railsy» способом достижения этого - см. Здесь для получения дополнительной информации .
SRack

Ответы:

167

Использовать обратную индексацию:

[1..-1]

Элемент в Ruby (и некоторых других языках) имеет прямой и «обратный» индекс. Таким образом, строка длиной nне имеет 0..(n-1)и дополнительные (-n)..-1показатели, но не более - вы не можете использовать >=nили <-nиндексы.

  '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
Хорошая иллюстрация, однако, использование вами «действительных» букв (т.е. букв, существующих в строке), на мой взгляд, немного вводит в заблуждение, поскольку данные за пределами строки действительно не определены. Это может быть что угодно, в том числе не символы. В любом случае, +1 за такой хорошо объясненный ответ :-)
Topher Fangio
19

Используйте 1 :-)

'Austin'[1..-1] # => "ustin"
Тофер Фанхио
источник
10

Довольно элегантно, если использовать бесконечный диапазон, представленный в Ruby 2.6:

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

Надеюсь, это кому-то пригодится. Вырезает пару символов из лучшего подхода до настоящего момента и будет очень удобочитаемым после регулярного принятия бесконечных диапазонов.

SRack
источник
3

Если вы присваиваете строку переменной, вы можете использовать длину / размер

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
Джейсон Ноубл
источник