我正在研究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_time
和second_time
的 object_id ,
assert_not_equal first_time.object_id, second_time.object_id
。它有效,但我是对的吗?作为Ruby和编程的初学者,什么是object_id
呢?
顺便说一下,是否有可能在降价中证明文本的合理性?
任何帮助将不胜感激!
答案 0 :(得分:0)
您不应该比较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_time
和second_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