저는 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
그것에 대해 생각하십시오 :
롤이 무작위이면 두 개의 연속 롤이 같을 가능성이 있습니다 (가능성은 아님). 이것을 테스트하는 더 좋은 방법은 무엇입니까?
내 생각은 테스트하는 것입니다 OBJECT_ID 의를 first_time
하고 second_time
사용 assert_not_equal first_time.object_id, second_time.object_id
. 작동하지만 내가 맞습니까? 루비와 프로그래밍의 초보자로서 object_id
참으로 무엇입니까? 그건 그렇고, 마크 다운의 텍스트를 정당화 할 수 있습니까?
어떤 도움을 주시면 감사하겠습니다!
object_id
s를 비교해서는 안되지만 s를 비교해야합니다 value
.
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다