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 

私はあなたが代替を知っていると思う:

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 

以上、OOPで。

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