Ruby Kata (ローマ数字コンバーター) を実行していて、1 つの巨大なブロックにならないようにコードを分離しようとしています。
これが私がこれまでに持っているものです:
def roman s
total = convert s[0,1]
(0..s.length).each do |i|
case convert (s[i+1,1]).to_i >= convert (s[i,1])
when true : total += convert s[i+1,1]
when false: total -= convert s[i+1,1]
end
end
total
end
def convert s
case s
when 'I' : 1
when 'V' : 5
when 'X' : 10
when 'L' : 50
when 'C' : 100
when 'D' : 500
when 'M' : 1000
else 0
end
case ステートメントをローマ法に移動したいので、次のようになります。
case preceding_number_is_lower_than_next_number s,i
メソッドを追加するとともに:
def preceding_number_is_lower_than_next_number s,i
convert (s[i+1,1]).to_i >= convert (s[i,1])
end
ただし、それを行って入力「XXXI」を与えると、29 の正しい出力から 10 の誤った出力に変わります。
リファクタリングされたばかりのまったく同じコードが実行されているため、なぜ動作が変わるのか想像できません。
何か案は?