为类方法的布尔状态创建while循环

时间:2014-11-04 21:58:53

标签: ruby testing refactoring

我有一个名为GuessingGame的类,其中有一个名为solved?的方法,它返回游戏的状态。当我运行时,一切都在这里工作。

我正在创建一些测试代码,并希望创建一个循环,直到solve方法返回true:

class GuessingGame
  def initialize(answer)
    @answer = answer
    @solved=false
  end

  def guess(guess_num)
    if guess_num < @answer
      @solved=false
      :low
    elsif guess_num > @answer
      @solved=false
      :high
    elsif guess_num = @answer
      @solved==true
      :correct
    end
  end

  def solved?
      @solved
  end
end

不起作用的测试代码:

game = GuessingGame.new(rand(75))
while game.solved? false
  puts "Guess a number between 1-75"
    guess_num=gets.chomp.to_i
  game.guess(guess_num)
end

Ruby不喜欢我的while game.solved? false并且说我的参数数量错误。

我在这里做错了什么?

我正在使用ruby 2.1.1p76。

3 个答案:

答案 0 :(得分:0)

在课堂上你需要:

class GuessingGame
  attr_reader :solved

attr_reader使您能够从外部类本身调用该类实例的属性。

来自API doc:

<强> attr_reader

  

创建返回实例变量和相应的方法   每个实例变量的值。

从这里你可以这样做:

class GuessingGame
  attr_reader :solved
  def initialize(answer)
    @answer = answer
    @solved=false
  end

  def guess(guess_num)
    if guess_num < @answer
      @solved=false
      :low
    elsif guess_num > @answer
      @solved=false
      :high
    elsif guess_num = @answer
      @solved=true
      :correct
    end
  end
end

要开始游戏,您只需稍微修改一下代码:

game = GuessingGame.new(rand(75))
until game.solved
  puts "Guess a number between 1-75"
    guess_num=gets.chomp.to_i
  game.guess_num(guess)
end

可以读取until循环,直到game.solved = true保持循环。

我认为您对while game.solved? false的意思是while game.solved == falsewhile game.solved == false在您的方案中可以正常使用。

在我的示例until game.solved中与until game.solved == true相同,只是两种不同的方式来执行相同的操作。希望有所帮助!

答案 1 :(得分:0)

我看看:

elsif guess_num = @answer

应该是:

elsif guess_num == @answer

答案 2 :(得分:0)

@ anthony的解决方案帮助了一下,我能够将测试代码更改为以下直到game.solved?

game = GuessingGame.new(rand(75))
until game.solved?
  puts "Guess a number between 1-75"
    guess_num=gets.chomp.to_i
  game.guess(guess_num)
end

我的类方法使用=而不是==

进行了不正确的比较

谢谢!