str[1..3] ってどういう意味?
Rubyを書いていると、文字列や配列の一部分を取り出す場面がよくあります。
そのときに使うのが スライス構文。
みたいな [ ] を使って一部分を取り出す書き方 のことを「スライス構文」って呼ぶらしい
Rubyだと「配列」や「文字列」に対して使える
例えば、次のコードを見てみる
str = "abcdefghijk"
p str[1..3]
これって何が出力されると思いますか?
Rubyのインデックスは0から始まる
Rubyでは文字列も配列も インデックスは0からスタートします。
インデックス: 0 1 2 3 4 5 ...
文字列 : a b c d e f ...
なので、str[1] は "b" になります。
..(ドット2つ)は範囲演算子(右端を含む)
p str[1..3] # => "bcd"
1..3 は インデックス1から3まで を意味するので、取り出されるのは "bcd"。
...(ドット3つ)は右端を含まない
p str[1...3] # => "bc"
1...3 は インデックス1以上3未満 を意味するので、取り出されるのは "bc"。
まとめ
- Rubyのインデックスは 0始まり
-
..→ 範囲(右端を含む) -
...→ 範囲(右端を含まない)
| 書き方 | 意味 | 結果(str = "abcdefghijk") |
|---|---|---|
str[1..3] |
インデックス1〜3を含む | "bcd" |
str[1...3] |
インデックス1〜2まで | "bc" |
str[0..2] |
インデックス0〜2を含む | "abc" |
おまけ:配列でも同じ!
arr = [10, 20, 30, 40, 50]
p arr[1..3] # => [20, 30, 40]
p arr[1...3] # => [20, 30]
文字列でも配列でも挙動は同じです。
おわりに
最初は「1..3って1文字目〜3文字目?」と勘違いしやすいですが、
あくまでインデックス(0始まり) であることを覚えておけば混乱しません。
これで str[1..3] も怖くない!!