2

ローマ数字からアラビア数字へのコンバーターを作成する必要がある演習に取り組んでいます。私が知る限り、以下のコードは完全にコーシャですが、テストを実行するとエラーが発生し続けます。Ruby は、37 行目に未定義のメソッドまたは変数があると考えています (以下のコメントで示されています)。

私のsnytaxがオフになっているのか、それとも何か他のものなのか疑問に思っています。提案?

class ArabicNumeral

  def replace_troublesome_roman_numerals(letters)
   tough_mappings = {"CM" => "DCCCC",  "CD" => "CCCC", "XC" => "LXXXX", "XL" => "XXXX", "IX"=> "VIIII", "IV" => "IIII"}
   tough_mappings.each { |roman, arabic|   letters = letters.gsub(roman, arabic) } 
   letters
  end

  def convert_and_add(letters)
    digits = { "M" => 1000, "CM" => 900, "D" => 500, "C" => 100, "XC" => 90, "L" => 50, "XL" => 40, "X" => 10, "IX" => 9, "V" => 5, "IV" =>  4, "I" => 1}
    letters = letters.split("")
    letters.inject(0) do |sum, letter|
      arabic = digits[letter]
      sum += arabic
    end  
  end

  def self.convert(letters)
    roman_string = replace_troublesome_roman_numerals(letters)  ###LINE 37!
    arabic_number = convert_and_add(roman_string)
    arabic_number
  end
end 
4

2 に答える 2

3

ここでの問題は、37 行目で呼び出しているメソッドですreplace_troublesome_roman_numerals(letters)。問題は、メソッドself.convert(letters)がクラス メソッドであることです。次のように呼び出すことができます。

ArabicNumeral.convert(letters)

ただし、インスタンス変数への呼び出しが含まれています (replace_troublesome_roman_numerals(letters)前述のとおりです。

def self.convert(letters)
    roman_string = ArabicNumeral.new.replace_troublesome_roman_numerals(letters)
    ArabicNumeral.new.convert_and_add(roman_string)

end

これにより、インスタンスが作成ArabicNumeralされ、変数に保存してメモリを消費することなく、必要なメソッドが呼び出されます。arabic_numberを呼び出しconvert_and_add(roman_string)て変数に追加し、変数を返すため、メソッドから変数も削除しました。はconvert_and_add(roman_string)メソッドによって処理される最後のものであるため、とにかく変数なしでこれを返します。

のインスタンスでこれらのメソッドを使用する予定がない場合は、すべてのメソッドをクラス レベルにするか、プロジェクトに含める にArabicNumeralラップすることをお勧めします。Moduleクラス外でそれらを使用する予定がまったくない場合は、ArabicNumeralそれらを後ろに置くprotectedprivate、使用可能なままにしておくことを検討してくださいconvert(letters)

class ArabicNumberal

def self.convert(letters)
   # Code...
end

private

def self.replace_troublesome_roman_numerals(letters)
   # Code...
end

def self.convert_and_add(roman_string)
   # Code...
end

end
于 2012-04-25T20:33:10.517 に答える
2

わかりました...まず、クラス 1 のインスタンス メソッドを使用しようとしています。

この問題は、convert メソッドを次のように変更することで解決できます。

def self.convert(letters)
    roman_string = replace_troublesome_roman_numerals(letters)  ###LINE 37!
    arabic_number = convert_and_add(roman_string)
    arabic_number
end

に:

def convert(letters)
    roman_string = replace_troublesome_roman_numerals(letters)  ###LINE 37!
    arabic_number = convert_and_add(roman_string)
    arabic_number
end

次に、インスタンスを作成して convert メソッドを呼び出す必要があります。

x = ArabicalNumeral.new()
x.convert('param')

以上です。

ちなみに、コンストラクターメソッドを追加することをお勧めします(Rubyではinitializeという名前です)。

以下の完全なスクリプト:

class ArabicNumeral

  def replace_troublesome_roman_numerals(letters)
   tough_mappings = {"CM" => "DCCCC",  "CD" => "CCCC", "XC" => "LXXXX", "XL" => "XXXX", "IX"=> "VIIII", "IV" => "IIII"}
   tough_mappings.each { |roman, arabic|   letters = letters.gsub(roman, arabic) } 
   letters
  end

  def convert_and_add(letters)
    digits = { "M" => 1000, "CM" => 900, "D" => 500, "C" => 100, "XC" => 90, "L" => 50, "XL" => 40, "X" => 10, "IX" => 9, "V" => 5, "IV" =>  4, "I" => 1}
    letters = letters.split("")
    letters.inject(0) do |sum, letter|
      arabic = digits[letter]
      sum += arabic
    end  
  end

  def convert(letters)
    roman_string = replace_troublesome_roman_numerals(letters)  ###LINE 37!
    arabic_number = convert_and_add(roman_string)
    arabic_number
  end
end

x = ArabicNumeral.new()
puts x.convert('MDC')
于 2012-04-25T20:26:07.963 に答える