【问题标题】:Why does this class definition result in a NoMethodError?为什么这个类定义会导致 NoMethodError?
【发布时间】:2020-02-27 01:02:21
【问题描述】:

我一直在寻找解决方案,但最相关的答案似乎是使用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

【问题讨论】:

  • 一旦你有了工作代码,我建议你将它发布到 SO 的姐妹网站Code Review。在那里,您将获得有关如何改进代码的有用建议。
  • 与您的问题无关,从风格上讲,我会将if !condition 更改为保护子句:raise 'foo' unless condition,然后是您在else 中的两行。
  • 同样不相关,可以更简单地定义Code::valid_pegsdef self.valid_pegs?(peg_arr); peg_arr.all? { |peg| POSSIBLE_PEGS.include?(peg.upcase) }; end。见Enumerable#all?。此外,all? 短路,这意味着(如果和)只要POSSIBLE_PEGS.include?(peg.upcase) #=&gt; falseall? 返回false,而不检查peg_arr 的其余元素。
  • 谢谢@CarySwoveland,我不知道代码审查。看起来是一个很好的资源。
  • 谢谢,@anothermh,我没有了解过unless,也没有听说过“保护条款”这个词。

标签: ruby class instance nomethoderror


【解决方案1】:

你快到了!

if !self.class.valid_pegs?(peg_arr)

if !Code.valid_pegs?(peg_arr)

定义 self.function-method(在本例中为 self.valid_pegs)是“类级别”或单例方法。
而在类定义中使用的“self”只是对对象的引用。

【讨论】:

  • 谢谢你,成功了。所以,如果我理解你,当我使用self. 在类中定义一个方法时,它是一个类方法,但是在类中调用它需要使用类名,因为在那种情况下self. 指的是一个实例?
  • 另外,不调用没有self.的方法不也是指实例吗?
  • 您的第一条评论是正确的!。第二个也是正确的。在您的示例代码中,您可以将 initialize-method 称为 initialize 或 self.initialize。但是你应该使用哪一个?全取决于你。尽管有一些关于编码最佳实践的建议,但这完全取决于你。你可以在这里查看:github.com/rubocop-hq/ruby-style-guide#no-self-unless-required P.S.您也可以使用 self 作为变量。有时本地(在方法内定义)和实例变量将具有相同的名称。在此使用 self 将有助于解决变量歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2013-02-25
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多