Edited at

splitメソッドを解剖してみる【Ruby】

More than 1 year has passed since last update.


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を追加して、最後の項目(茨城)を対象に別処理を追加しました。