【问题标题】:ruby class undefined method (NoMethodError)ruby 类未定义方法 (NoMethodError)
【发布时间】:2018-05-16 16:32:37
【问题描述】:

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

: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)

我做错了什么?我的精神错在哪里?

【问题讨论】:

    标签: ruby class methods


    【解决方案1】:

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

    如果你真的希望它在factors方法中引用30,你必须将它定义为实例方法,因为调用的是对象(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
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2022-01-13
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多