簡體   English   中英

紅寶石類未定義方法(NoMethodError)

[英]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)

我究竟做錯了什么? 我的精神失誤在哪里?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM