Рубиновая идиома для подстроки от индекса до конца строки

Просто интересно, есть ли идиома Ruby для извлечения подстроки из индекса до конца строки. Я знаю str[index..-1], который работает, передавая объект диапазона методу [] String, но он немного неуклюж. В python, например, вы можете написать str[index:], что неявно даст вам остальную часть строки.

Пример:

s = "hello world"
s[6..-1] # <-- "world"

Есть ли что-нибудь лучше, чем s[6..-1]?


person Sherwin Yu    schedule 13.02.2013    source источник
comment
Я думаю, что явность лучше, чем неявность в этом случае.   -  person Flauwekeul    schedule 13.02.2013
comment
@Flauwekeul Почему Range в этом отношении тупица?   -  person Paul Brit    schedule 13.02.2013
comment
Что ты имеешь в виду под словом кланк?   -  person Flauwekeul    schedule 13.02.2013
comment
@Flauwekeul Извините, я перепутал вас с владельцем этого вопроса.   -  person Paul Brit    schedule 13.02.2013
comment
Я думаю, что это неуклюже только потому, что индекс -1 не очень интуитивно понятен.   -  person Sherwin Yu    schedule 14.02.2013
comment
Это также неуклюже, потому что 6..-1 — это пустой диапазон. :-/ s[0..5] можно понимать как (0..5).map{|i| s[i]}.join, но (6..-1).map{|i| s[i]}.join — это пустая строка.   -  person Eric Duminil    schedule 21.11.2017
comment
Отвечает ли это на ваш вопрос? Как получить подстроку с позиции N до последнего символа в Ruby 1.8.7?   -  person Jon Schneider    schedule 17.04.2021


Ответы (6)


Я думаю, что это не так.

Кажется, что Range это лучший способ сделать это.

person Paul Brit    schedule 13.02.2013
comment
Извините, не могли бы вы уточнить? Вы думаете, что Range (как я указал в вопросе) - лучший способ сделать это? - person Sherwin Yu; 13.02.2013

Вот "лучше", если хотите. Вы можете расширить класс ruby ​​String, а затем использовать этот метод в своем коде. Например:

class String
  def last num
    self[-num..-1]
  end
end

А потом:

s = "hello world"
p s.last(6)
person Yevgeniy Anfilofyev    schedule 13.02.2013
comment
OP не спрашивал, как получить последние X символов. Они спросили, как получить символы от X до конца строки. - person Nicholas Blasgen; 13.02.2016

В Ruby 2.6 появились бесконечные диапазоны, которые в основном устраняет необходимость указывать конечный индекс. В вашем случае вы можете сделать:

s = "hello world"
s[6..]
person vicentazo    schedule 28.06.2019

Чтобы получить строку из диапазона:

s = 'hello world'
s[5..s.length - 1] # world

Однако, если вы просто хотите получить последнее слово:

'hello world'.split(' ').last # world
person Simon Tsang    schedule 16.09.2016
comment
Должно быть s[5..s.length - 1] - person Eric Duminil; 21.11.2017

Вы можете расширить класс String. Не уверен, что это рубиновая идиома:

class String
  def last(n)
    self[(self.length - n)..-1]
  end
end
person Flauwekeul    schedule 13.02.2013
comment
OP хочет, чтобы последние символы начинались с n. Не последние n символы. - person Eric Duminil; 21.11.2017

Библиотека Rails activesupport (которую можно установить как независимую от Rails гем) добавляет к строкам метод from:

> s = "hello world"
"hello world"
> s.from(6)
"world"

https://api.rubyonrails.org/classes/String.html#method-i-from

person MothOnMars    schedule 28.09.2018