Індекс зрізу рубінового рядка: str [n..infinity]


84

Легке запитання, але не вдалося знайти його в документі.

Як зрізати рядок чи масив nназавжди?

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

1
Останній працюватиме з Ruby 2.6 і, ймовірно, стане «Railsy» способом досягнення цього - див. Тут для отримання додаткової інформації .
SRack

Відповіді:


165

Використовуйте зворотне індексування:

[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 за таку добре пояснену відповідь :-)
Тофер Фанджо


10

Дуже елегантно, використовуючи нескінченний асортимент, представлений в Ruby 2.6:

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

Сподіваюся, це комусь зручно. Вирізає пару символів від найкращого підходу до цих пір, і буде дуже читабельним, коли регулярно будуть прийматися нескінченні діапазони.


3

Якщо ви призначите рядок змінній, ви можете використовувати довжину / розмір

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.