Ruby Koans中test_changing_hashes的附加问题的答案是什么?

64
Ruby Koans中,关于哈希的部分(about_hashes.rb)包括以下代码和注释:
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

我无法回答评论中的奖励问题 - 我尝试实际执行他们建议的替换,结果是一样的。我只能理解它是为了可读性,但我在本教程的其他地方没有看到类似的编程建议。

(我知道这听起来像某个已经得到权威回答的问题,但我找不到任何权威的资料。)

4个回答

93

这是因为您不能像这样使用:

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

Ruby认为{ ... }是一个块(block),因此它应该被“分解成变量”,但你总是可以使用assert_equal({:one => "eins", :two => "dos" }, hash)


我非常喜欢那个答案,除了当我实际尝试按照你的建议替换哈希时,它仍然可以正常工作并且断言通过。编辑 - 不,我没有 - 我进行了较小的更改,使断言与“true”进行比较。我会尝试你的建议,这样我就可以看到它出错了。 :) 谢谢! - Bruce
3
谢谢你使它更加易于理解。我对此并不感到太糟糕,因为《公案》甚至还没有向我介绍“块”这个概念就已经出了问题。 - Bruce
1
(我是 Ruby 初学者)既然我们已经修改为使用变量,为什么不直接使用(assert_equal expected,hash),而要使用(assert_equal true,expected == hash)呢? - Ege Özcan
2
那个答案是错误的。Koans和OP不会像上面那样编写代码。 如果要字面理解,它应该如下所示:assert_equal true,{:one =>“eins”,:two =>“dos”} == hash - skrobul
最后一个断言不再起作用了(是的,已经过去10多年了,Ruby版本为3.0.2p107);有效的方法是:assert_equal ({:one =>“eins”,:two =>“dos”}),hash - user3054986

2

我认为这更易读,但你仍然可以像这样做:

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

这种方法的缺点是不能显示实际值,而且比 assert hash == { :one => "eins", :two => "dos" } 更冗长。(我猜测但不确定顺序必须像我所做的那样反转。) - PJTraill

0

我将变量expected与哈希值进行比较,而不是破坏

expected = { :one => 'eins', :two => "dos" }

assert_equal expected, hash

0

你可以使用另一个测试:

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

我只是交换了assert_equal的参数。

在这种情况下,Ruby不会抛出异常。

但对我来说,这仍然是一个糟糕的解决方案。使用单独的变量并测试布尔条件要更可读。


我假设你实际上是想要 assert_equal hash, { :one => "eins", :two => "dos" } - Cincinnati Joe
由于某些原因,断言函数的签名为“(期望值,实际值)”。hash是“实际值”,不应该作为第一个参数。如果断言成功并不重要,但是在使用错误顺序的参数时,当断言失败时会产生混淆的消息。 - axiac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接