but*_*y85 0 ruby oop if-statement ternary-operator stack-level
我正在编写名为Robot name的编码挑战.我也有测试.该计划通过了所有测试.代码在下面..
class Robot
attr_accessor :name
@@robots = []
def initialize
@name = self.random_name
@@robots << self.name
end
def random_name
name = ''
2.times do
name << ('a'..'z').to_a.sample
end
3.times do
name << (1..9).to_a.sample.to_s
end
no_duplicate(name.upcase)
end
def reset
@name = self.random_name
end
def no_duplicate(name)
if @@robots.include? name
reset
else
name
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果您需要查看测试文件,可以在这里查找robot_name_tests.
然后我开始重构,其中一件事就是重构no_duplicate方法.所以在重构后代码看起来像这样
class Robot
...
# the rest of code stayed the same
def no_duplicate(name)
@@robots.include? name ? reset : name
end
end
Run Code Online (Sandbox Code Playgroud)
所有测试均显示此版本SystemStackError: stack level too deep.考虑到提供的代码,为什么会出现此错误以及在两种情况下幕后发生的情况?谢谢!
我喜欢你的诗歌模式代码,但这导致你在这里遇到麻烦.
有一种方法可以保持它在诗歌模式,但修复您的运营商优先级问题是这样做:
def no_duplicate(name)
(@@robots.include? name) ? reset : name
end
Run Code Online (Sandbox Code Playgroud)
更新:如果你在Big Corporation使用编码标准工作,你需要让它更无聊.我认为这是显而易见的,但画廊正确地注意到通常的解决方案:
@@robots.include?(name) ? reset : name
Run Code Online (Sandbox Code Playgroud)