ruby 类未定义方法 (NoMethodError)

标签 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)

我做错了什么?我的心理错误在哪里?

最佳答案

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

关于ruby 类未定义方法 (NoMethodError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612539/

相关文章:

ruby - 使用正则表达式替换 Ruby 中不在引号中的所有空格

class - 在与语言无关的上下文和 typescript 中,环境类是什么?

java - 当我打印它们时,值不会改变

PHP类设计问题

c++ - 删除库中的全局变量

Java - 在矩阵行或列上应用 vector 方法

c++ - C++如何找到函数声明

ruby-on-rails - Rails 模型错误 AssociationTypeMismatch expected, got String

php - 从 Ruby 调用 PHP 并获取响应

ruby - 如何使用 Poltergeist/Capybara/Rspec 记录 javascript 错误?