【发布时间】: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_pegs:def self.valid_pegs?(peg_arr); peg_arr.all? { |peg| POSSIBLE_PEGS.include?(peg.upcase) }; end。见Enumerable#all?。此外,all?短路,这意味着(如果和)只要POSSIBLE_PEGS.include?(peg.upcase) #=> false,all?返回false,而不检查peg_arr的其余元素。 -
谢谢@CarySwoveland,我不知道代码审查。看起来是一个很好的资源。
-
谢谢,@anothermh,我没有了解过
unless,也没有听说过“保护条款”这个词。
标签: ruby class instance nomethoderror