2017-12-02 7 views
0

불행히도 다음 오류가 발생합니다. 왜 작동하지 않는지 나는 이해할 수 없다.ruby ​​class undefined method (NoMethodError)

:14:in `convert': undefined method `factors' for 30:Fixnum (NoMethodError) 
    from question_stack.rb:18:in `<main>' 

나는 다음과 같은 클래스를 만들려고 : 내가 잘못 뭐하는 거지

# Class Wordgame 
class Wordgame 
    WORDGAME_MAP = { 
    '3' => 'baa', 
    '5' => 'bar', 
    '7' => 'bla' 
    }.freeze 

    def self.factors 
    (1..self).select { |n| (self % n).zero? } 
    end 

    def self.convert(number) 
    number.factors.map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join 
    end 
end 

Wordgame.convert(30) 

? 내 정신적 인 오류는 어디에 있습니까?

답변

1

self은 클래스 메서드의 클래스 자체 또는 인스턴스 메서드의 현재 개체를 나타냅니다. 귀하의 경우에는 객체 클래스 인 WordGame을 참조합니다. Integer 클래스

을 여는

객체 ( 30) 호출하기 때문에 당신이 정말로, 당신이 인스턴스 메서드로 정의해야하는 factors 방법에 30 참조 할 경우

아니라 클래스 (Integer)

class Integer 
    def factors 
    (1..self).select { |n| (self % n).zero? } 
    end 
end 

난 당신이 대안을 알고 있다고 생각 : OOP와

def self.factors(x) 
    (1..x).select { |n| (self % n).zero? } 
end 

def self.convert(number) 
    factors(number).map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join 
end 

또는 더 나은.

class WordGame 
    def initialize(n) 
    @n = n 
    end 

    def convert 
    factors.map(&:to_s).each.map { |char| WORDGAME_MAP[char] }.join 
    end 

    private 

    def factors 
    ([email protected]).select { |m| (@n % m).zero? } 
    end 
end 

Wordgame.new(30).convert