2017-02-01 10 views
0

私はRuby Koans(Rubyのチュートリアルプロジェクト)を使って作業しています。 About_Dice_Projectでは、DiceSetという名前のクラスを作成することが望まれます。私は成功しますが、面白い質問があります。Ruby Koans:同じ値を持つ2つの異なるダイスをテストします。

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 

それについて考える:

ロールがランダムである場合、それは可能である(が、ではない)、2つの連続するロールが等しいこと。これをテストするには、 の方がいいでしょうか?

私の考えは assert_not_equal first_time.object_id, second_time.object_idを使用して、first_timesecond_timeOBJECT_IDをテストすることです。それは動作しますが、私は正しいですか? Rubyとプログラミングの初心者として、実際にobject_idとは何ですか? ところで、マークダウンのテキストを正当化することは可能ですか?

ご協力いただければ幸いです!

+0

:どの2つの連続したロールが等しくないことを確実にする

それについて考え

一つの方法は、whileループを使用することです。それはRubyについてですか、それともMarkdownについてですか? –

+0

ルビーについて、混乱させて申し訳ありません^^ –

答えて

0

のobject_idと平等

あなたはobject_id 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_timesecond_timeは互いに独立して作成されるので、同じオブジェクトを参照することはできません。彼らは同じ値を持つことができます。私はあなたの質問で混乱しています

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 
+0

助けていただきありがとうございますが、「考えてください」の部分を見てください。ロールがランダムである場合、2つの連続したロールが等しい(可能性は低いが)可能性がある。この場合、テスト 'assert_not_equal first_time、second_time'は失敗します。 –

+1

"2つの変数が同じ' object_id'を持っている場合 " - 変数には' object_id'がありません。オブジェクトだけが行います( 'object_id'sと呼ばれます)。変数はRubyのオブジェクトではありません(ほとんどの他の言語と同様)。 –

+0

@JörgWMittag:ありがとう。編集はより良いですか? –

関連する問題