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

テスト ファイルが必要な場合は、ここで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

このバージョンでは、すべてのテストでSystemStackError: stack level too deep. 提供されたコードを考慮して、なぜこのエラーが発生し、両方のケースで舞台裏で何が起こっているのでしょうか? ありがとう!

4

1 に答える 1

5

あなたの詩モードのコードは気に入っていますが、ここで問題が発生しました。

ちょっと詩モードのままにして、オペレーターの優先順位の問題を解決する1つの方法は、これを行うことです:

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

更新:コーディング標準を使用する大企業で働いている場合は、もう少し退屈なものにする必要があります。これは明らかだと思いましたが、ギャラリーは通常の解決策を正しく指摘しています:

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