Почему это определение класса приводит к NoMethodError? - PullRequest
2 голосов
/ 27 февраля 2020

Я искал решение для этого, но наиболее подходящие ответы, кажется, прописывают, используя self., что я уже делаю; Я не могу сформулировать свой поиск таким образом, чтобы я мог найти то, что я делаю неправильно. Я определяю класс, как показано ниже, но когда я пытаюсь создать экземпляр, я получаю

NoMethodError:
       undefined method `valid_pegs?' for #<Code:0x00007fffc58d1608>

. Вместо этого я попытался определить valid_pegs? как метод экземпляра, который я могу использовать, если Назовите это так, но это проблема для курса, и я должен определить его как метод класса.

Так почему же он не работает?

class Code
  POSSIBLE_PEGS = {
    "R" => :red,
    "G" => :green,
    "B" => :blue,
    "Y" => :yellow
  }

  attr_reader :pegs

  def self.valid_pegs?(peg_arr)
    outcome = true
    peg_arr.each {|peg| outcome = false if !POSSIBLE_PEGS.include?(peg.upcase)}
    return outcome
  end

  def initialize(peg_arr)
    if !self.valid_pegs?(peg_arr)
      raise "Those are not all valid pegs"
    else
      @pegs = []
      peg_arr.each {|peg| @pegs << peg.upcase}
    end
  end

end

1 Ответ

2 голосов
/ 27 февраля 2020

Вы почти у цели!

if !self.class.valid_pegs?(peg_arr)

или

if !Code.valid_pegs?(peg_arr)

Определение метода self.function (в данном случае self.valid_pegs) - это "уровень класса" или одноэлементный метод. В то время как «self» используется внутри определения класса, это просто ссылка на объект.

...