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)