2012-04-25 4 views
2

나는 아랍어 숫자 변환기에 로마어를 만들어야하는 연습을하고 있습니다. 제가 말할 수있는 한, 아래의 코드는 완전히 정결합니다.하지만 테스트를 실행할 때 오류가 계속 발생합니다. 루비는 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)이 클래스 메소드입니다. 이처럼 호출 할 수

ArabicNumeral.convert(letters) 

을하지만, 그것은 (앞서 언급 replace_troublesome_roman_numerals(letters) 것을있는 인스턴스 변수로 호출을 포함 이것은 ArabicNumeral의 인스턴스를 생성하고 메소드를 호출

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

end 

. 변수에 저장하고 메모리를 차지하지 않고도 필요합니다. convert_and_add(roman_string)을 호출하고 변수에 추가 한 다음 변수를 반환하기 때문에 메서드에서 변수 arabic_number을 제거했습니다. 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

좋아요. 우선, 클래스 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') 

그리고 그게 전부입니다.

그건 그렇고, 나는 당신이 생성자 메서드를 추가하는 것이 좋습니다 (루비에서 초기화라는). 아래

전체 스크립트 :

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') 
관련 문제