0

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 の誤った出力に変わります。

リファクタリングされたばかりのまったく同じコードが実行されているため、なぜ動作が変わるのか想像できません。

何か案は?

4

0 に答える 0