Ruby Koans:测试具有相同值的两组不同的骰子

时间:2017-02-01 09:38:14

标签: ruby markdown

我正在研究Ruby Koans(Ruby的教程项目)。在 About_Dice_Project 中,需要创建名为 DiceSet 的类。我成功了,但有一个有趣的问题。

以下是代码:

class DiceSet

  # Attribute reader
  attr_reader :values

  # Initializer
  def initialize
    @values = []
  end

  # Roll method
  def roll(dice_amount)
    @values = Array.new(dice_amount) { rand(1..6) }
  end
end

这个测试很有意思:

def test_dice_values_should_change_between_rolls
    dice = DiceSet.new

    dice.roll(5)
    first_time = dice.values

    dice.roll(5)
    second_time = dice.values

    assert_not_equal first_time, second_time,
      "Two rolls should not be equal"
  end
  

关于它的想法:

     

如果卷是随机的,那么它是可能的(尽管不是    可能)两个连续的卷是相等的。会是什么    更好的方法来测试这个?

我的想法是测试first_timesecond_time object_id assert_not_equal first_time.object_id, second_time.object_id。它有效,但我是对的吗?作为Ruby和编程的初学者,什么是object_id呢? 顺便说一下,是否有可能在降价中证明文本的合理性?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

object_ids和相等

您不应该比较object_id,而是value s。

a = [1, 2, 3]
b = [1, 2, 3]

puts a == b
#=> true
puts a.object_id == b.object_id
#=> false

通过比较object_id s,您正在测试变量是否引用完全相同的对象。在您的情况下,first_timesecond_time是彼此独立创建的,因此它们无法引用同一个对象。但是,它们可以具有相同的值。

想一想

确保没有两个连续卷相同的一种方法是使用while循环:

class DiceSet
  # Attribute reader
  attr_reader :values

  # Initializer
  def initialize
    @values = []
    @last_values = []
  end

  # Roll method
  def roll(dice_amount)
    while @values == @last_values
      @values = Array.new(dice_amount) { rand(1..6) }
    end
    @last_values = @values
    @values
  end
end

dice = DiceSet.new

dice.roll(5)
first_time = dice.values

dice.roll(5)
second_time = dice.values # <-- cannot be equal to first_time