如果我在方法中使用常规if语句但是在使用三元运算符时"堆栈级别太深",程序为什么会通过所有测试呢?

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.考虑到提供的代码,为什么会出现此错误以及在两种情况下幕后发生的情况?谢谢!

Dig*_*oss 5

我喜欢你的诗歌模式代码,但这导致你在这里遇到麻烦.

有一种方法可以保持它在诗歌模式,但修复您的运营商优先级问题是这样做:

   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)

  • 一个更惯用的解决方案是简单地在参数周围使用括号:`@@ robots.include?(name)?...` (3认同)