Me refiero a esta prueba en about_symbols.rb en Ruby Koans https://github.com/edgecase/ruby_koans/blob/master/src/about_symbols.rb#L26
def test_method_names_become_symbols
symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
assert_equal true, symbols_as_strings.include?("test_method_names_become_symbols")
end
# THINK ABOUT IT:
#
# Why do we convert the list of symbols to strings and then compare
# against the string value rather than against symbols?
¿Por qué exactamente tenemos que convertir esa lista en cadenas primero?

Symbol.all_symbolsa una variable y luego probar su inclusión. Los símbolos son más rápidos en la comparación y está evitando convertir miles de símbolos en cadenas.include?Si especificamos:test_method_names_become_symbols, no tendríamos que convertir todos esos símbolos en cadenas.:test_method_names_become_symbolsen la comparación lo creará, por lo que la comparación siempre será cierta. Al convertirall_symbolsa cadenas y comparar cadenas, podemos distinguir si el símbolo existía antes de la comparación.Porque si lo haces:
assert_equal true, all_symbols.include?(:test_method_names_become_symbols)Puede (dependiendo de su implementación de ruby) ser verdadero automáticamente, porque
:test_method_names_become_symbolscrea el símbolo. Consulte este informe de errores .fuente
Ambas respuestas anteriores son correctas, pero a la luz de la pregunta de Karthik anterior, pensé que publicaría una prueba que ilustra cómo se puede pasar con precisión un símbolo al
includemétodo.def test_you_create_a_new_symbol_in_the_test array_of_symbols = [] array_of_symbols << Symbol.all_symbols all_symbols = Symbol.all_symbols.map {|x| x} assert_equal false, array_of_symbols.include?(:this_should_not_be_in_the_symbols_collection) #this works because we stored all symbols in an array before creating the symbol :this_should_not_be_in_the_symbols_collection in the test assert_equal true, all_symbols.include?(:this_also_should_not_be_in_the_symbols_collection) #This is the case noted in previous answers...here we've created a new symbol (:this_also_should_not_be_in_the_symbols_collection) in the test and then mapped all the symbols for comparison. Since we created the symbol before querying all_symbols, this test passes. endUna nota adicional sobre los Koans: utilice
putsdeclaraciones y pruebas personalizadas si no comprende nada. Por ejemplo, si ve:string = "the:rain:in:spain" words = string.split(/:/)y no tengo idea de lo que
wordspodría ser, agregue la líneay ejecutar
rakeen la línea de comandos. Del mismo modo, las pruebas como la que agregué anteriormente pueden ser útiles para comprender algunos de los matices de Ruby.fuente