2011-09-23 14 views
55

En el Ruby Koans, la sección about_hashes.rb incluye el siguiente código y comentario:¿Cuál es la respuesta a la pregunta de bonificación en test_changing_hashes de Ruby Koans?

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 

no puedo averiguar la respuesta a la pregunta de bonificación en el comentario - He intentado hacer realidad la sustitución sugieren, y el resultado es el mismo Todo lo que puedo entender es que es para facilitar la lectura, pero no veo consejos de programación general como ese en otro lugar de este tutorial.

(Sé que esto suena como algo que ya se respondió en alguna parte, pero no puedo desenterrar algo de autoridad.)

Respuesta

81

Es porque no se puede usar algo como esto:

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

Ruby piensa que {...} es un bloque. Por lo tanto, debe "roto a cabo en una variable" pero siempre se puede utilizar assert_equal({ :one => "eins", :two => "dos" }, hash)

+0

estoy totalmente de esa respuesta, excepto que cuando en realidad trató de sustituir el hash como usted sugiere, todavía funcionaba bien y la afirmación pasó. EDITAR - no, no lo hice - hice el cambio menor que dejó la afirmación de comparar contra 'verdadero'. Probaré tu sugerencia y así podré ver cómo se rompe. :) ¡Gracias! – Bruce

+2

Eso lo hizo romper, gracias de nuevo. No me siento mal por eso, ya que los Koans ni siquiera me han presentado el concepto de 'bloques'. – Bruce

+1

(noob ruby ​​aquí) así que como ya hemos hecho el cambio para usar una variable, ¿por qué no simplemente usamos (assert_equal expected, hash) sino que usamos (assert_equal true, expected == hash)? –

0

Otra prueba que puede utilizar es la siguiente:

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

He intercambiado simplemente los parámetros a assert_equal. En este caso, Ruby no lanzará una excepción.

Pero todavía me parece una mala solución. Es mucho más legible usando una variable separada y probando una condición booleana.

+0

Supongo que realmente quiso decir 'assert_equal hash, {: one =>" eins ",: two =>" dos "}' –

+0

Sí, lo siento. Lo escribí mal –

2

me pareció que era más fácil de leer, pero todavía se puede hacer algo como esto:

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

Tiene la desventaja de no mostrar los valores reales y es más detallado que 'assert hash == {: one =>" eins ",: two =>" dos "}'. (Sospecho pero no sé que el orden debe invertirse como lo hice). – PJTraill

Cuestiones relacionadas