substring とか substr とか charAt とか的な機能。
はまった 。・゚・(ノД`)・゚・。
文字の位置を指定して一文字だけ取得するメソッド(引数が1つ)は、String型ではなく、文字コード(Integer型)で返すので注意。
文字(String)として取得したいなら引数が二つあるほうで、二つ目の引数に取得したい文字列長(つまり1)を指定すること。
nth 番目のバイトを整数 (文字コード) で返します。 nth が負の場合は文字列の末尾から数えます。つまり、 self.size + nth 番目のバイトを返します。
nth が範囲外を指す場合は nil を返します。
instance method String#[]
えー。
引数と戻り値をざっとリストアップするとこんな感じ。
なんで Integer の戻り値があるの。。。 (はまりポイント)
self[nth] -> Integer
slice(nth) -> Integer
self[nth, len] -> String | nil
slice(nth, len) -> String | nil
self[substr] -> String | nil
slice(substr) -> String | nil
self[regexp, nth = 0] -> String
slice(regexp, nth = 0) -> String
self[range] -> String
slice(range) -> String
とりあえず、挙動を確認するためのサンプルコードを書いて実行。
$ cat ./string_slice.rb
target = 'abc'
puts 'target = \'abc\''
for i in -4..4
s = target[i]
s = 'nil' if s == nil
puts "target[#{i}] => [#{s}]"
end
for i in -4..4
s = target[i,1]
s = 'nil' if s == nil
puts "target[#{i},1] => [#{s}]"
end
$ ruby ./string_slice.rb
target = 'abc'
target[-4] => [nil]
target[-3] => [97]
target[-2] => [98]
target[-1] => [99]
target[0] => [97]
target[1] => [98]
target[2] => [99]
target[3] => [nil]
target[4] => [nil]
target[-4,1] => [nil]
target[-3,1] => [a]
target[-2,1] => [b]
target[-1,1] => [c]
target[0,1] => [a]
target[1,1] => [b]
target[2,1] => [c]
target[3,1] => []
target[4,1] => [nil]
というわけで、引数がひとつしかないString#[]とString#sliceにはご注意を。
Ref. Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Stringクラス
tags: ruby
Posted by NI-Lab. (@nilab)