2011-09-23 4 views
55

は、セクションabout_hashes.rbは、次のコードとコメントが含まれます。Ruby Koansのtest_changing_hashesでのボーナスの質問に対する答えは? <a href="http://rubykoans.com">Ruby Koans</a>で

def test_changing_hashes 
    hash = { :one => "uno", :two => "dos" } 
    hash[:one] = "eins" 

    expected = { :one => "eins", :two => "dos" } 
    assert_equal true, expected == hash 

    # Bonus Question: Why was "expected" broken out into a variable 
    # rather than used as a literal? 
end 

を私がコメントでボーナスの質問に答えを把握することはできません - 私は実際に彼らが提案する置換をやってみました、結果は同じです。私が知ることができるのは、読みやすくするためですが、このチュートリアルのどこかで呼び出されたような一般的なプログラミングに関するアドバイスはありません。

(私はこれはすでにどこかで答えられる何かのように聞こえるけど、私は権威何かを掘ることができません。)

答えて

81

あなたはこのようなものを使用することはできませんので、それはです:

assert_equal { :one => "eins", :two => "dos" }, hash 

Rubyは{...}がブロックだと思っています。私は単にassert_equalにパラメータを入れ替えました

assert_equal hash, {:one => "eins", :two => "dos"} 

:以下れるので、あなたは、「変数にそれを壊れた」はずですが、あなたは常にassert_equal({ :one => "eins", :two => "dos" }, hash)

+0

I完全にその答えのようにそしてその主張は合格した。編集 - 私はしませんでした - 私は、「真実」と比較して主張を残して、それほど変更を加えませんでした。私はあなたの提案を試みるので、私はそれが壊れて見ることができます。 :)ありがとう! – Bruce

+2

それは、もう一度おかしくなりました。私はそれについてあまり気にしていません。なぜなら、コーンズはまだ私を「ブロック」の概念に導入していないからです。 – Bruce

+1

(ルビーnoobここ)ので、私たちはすでに変数を使用するように変更したので、単に(assert_equal expected、hash)を使用するのではなく、(assert_equal true、expected == hash)を使用するのはなぜですか? –

0

あなたが使用できる別のテストを使用することができます。 この場合、Rubyは例外をスローしません。

しかし、それでも私にとっては悪い解決策に思えます。別の変数を使用し、ブール条件をテストすると、はるかに読みやすくなります。

+0

私はあなたが実際に'assert_equal hash、{:one =>" eins "、:two =>" dos "}' –

+0

うん、申し訳ありません。私は間違って書いた –

2

私はそれがより読みやすいと思いましたが、あなたはまだこのような何か行うことができます:あなたが提案として、私は実際にハッシュを代用しようとしたとき、それはまだうまく働いたことを除いて、

assert_equal true, { :one => "eins", :two => "dos" } == hash 
+0

これは、実際の値を表示しないという欠点があり、 'assert hash == {:one =>" eins "、:two =>" dos "}'よりも冗長です。 (私は疑いがあるが、私のやり方とは逆の順序でなければならないことは知らない。) – PJTraill