0

我正在处理名为机器人名称的编码挑战。我也对此进行了测试。该程序通过了所有测试。代码如下..

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

如果您需要查看测试文件,可以在此处查看robots_name_tests

然后我开始重构,第一件事就是重构no_duplicate方法。所以重构后的代码看起来像这样

class Robot

  ...
  # the rest of code stayed the same

  def no_duplicate(name)
    @@robots.include? name ? reset : name
  end
end

有了这个版本,所有的测试都显示出来了SystemStackError: stack level too deep。考虑到提供的代码,为什么会出现此错误以及在这两种情况下的幕后情况?谢谢!

4

1 回答 1

5

我喜欢你的诗歌模式代码,但它给你带来了麻烦。

将其保持在诗歌模式但解决您的操作员优先级问题的一种方法是执行以下操作:

   def no_duplicate(name)
     (@@robots.include? name) ? reset : name
   end

更新:如果你在遵循编码标准的大公司工作,你需要让它变得更无聊。我认为这很明显,但画廊正确地注意到了通常的解决方案:

   @@robots.include?(name) ? reset : name
于 2016-06-21T00:16:48.647 回答