Ruby文字列スライスインデックス:str [n..infinity]


84

簡単な質問ですが、ドキュメントで見つかりませんでした。

文字列または配列をn永久にスライスするにはどうすればよいですか?

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

1
後者はRuby2.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 :-)
— Topher Fangio


10

Ruby 2.6で導入された無限の範囲を使用して、かなりエレガントです。

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

それが誰かにとって便利であることを願っています。これまでの最善のアプローチから数文字を切り取り、無限の範囲が定期的に採用されると非常に読みやすくなります。


3

文字列を変数に割り当てる場合は、長さ/サイズを使用できます

string = 'Austin'
string[1..string.length]  # => ustin
string[1..string.size]    # => ustin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.