2012-04-25 21 views
2

私はローマ字からアラビア数字への変換を行う必要がある練習に取り組んでいます。私が知る限り、以下のコードは完全に正当なものですが、テストを実行するとエラーが発生します。 Rubyは37行目に未定義のメソッドや変数があると思っています(以下のコメントで言及します)。クラスのメソッドを呼び出すためのRubyの構文

私の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 

答えて

3

問題ここでは、線37 replace_troublesome_roman_numerals(letters)に呼びかけている方法です。問題はメソッドself.convert(letters)がクラスメソッドであることです。しかし、それは(replace_troublesome_roman_numerals(letters)私は前に述べたということで、インスタンス変数への呼び出しが含まれてい

ArabicNumeral.convert(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クラス以外で使用する予定がない場合は、protectedまたはprivateの後ろに置き、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 
+1

ありがとうございます!私はすべてのメソッドを "クラスレベル"に持って行きました。私は "自己"をポップした。各メソッド名の前に、私のすべてのテストがパスします。 –

2

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

問題は方法を変更することで解決できるから変換する:に

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 

その後は、インスタンスを作成し、変換メソッドを呼び出す必要があります:

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') 
関連する問題