ruby class undefined方法(NoMethodError)

时间:2017-12-02 21:00:00

标签: ruby class methods

不幸的是,我收到以下错误。我不太明白为什么它不起作用?

: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 个答案:

答案 0 :(得分:1)

self在类方法中引用类本身,或在实例方法中引用当前对象。在您的情况下,它指的是WordGame,即对象的类。

如果你真的希望它将30引用到factors方法中,你必须将它定义为实例方法,因为调用了一个对象(30),而不是一个类(Integer),打开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
    (1..@n).select { |m| (@n % m).zero? }
  end
end

Wordgame.new(30).convert