splitメソッドを解剖してみる
たまにこのメソッドはどのような中身になっているのか。。。となることがありまして、今回はsplitメソッドを解剖してみます。つまり、splitと同じ処理をあえてsplitを使わずやってみます。
splitの仕様
splitメソッドは、文字列を特定の区切り文字で分割し、配列化するメソッドです。
strs = "栃木;群馬;茨城"
splitted_strs = strs.split(";")
puts splitted_strs #=> ["栃木", "群馬", "茨城"]
実際の解剖コード
こんな感じで書いてみました。
ruby.rb
class Tokenizer
def initialize(strs)
@strs = strs
end
def tokenize(delim)
one_chara_items = []
stocked_items = []
@strs.each_char.with_index do |ch, num|
if ch == delim
stocked_items.push(one_chara_items.join)
one_chara_items = []
elsif num == @strs.length - 1
one_chara_items.push(ch)
stocked_items.push(one_chara_items.join)
one_chara_items = []
else
one_chara_items.push(ch)
end
end
@stocked_items = stocked_items
end
def tokens
@stocked_items
end
end
tokenizer = Tokenizer.new("栃木;群馬;茨城")
tokenizer.tokenize(";")
puts tokenizer.tokens #=> ["栃木", "群馬", "茨城"]
一番困ったのは、delimが文字の後(栃木、群馬の後の;)に来るものでないと、最初のif文(ch == delim)は効果を発揮しないということです。つまり、茨城の後には;が来ていないので、このif文だと、茨城が配列に入りません。
なので、elsifを追加して、最後の項目(茨城)を対象に別処理を追加しました。