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_symbols
a 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_symbols
en la comparación lo creará, por lo que la comparación siempre será cierta. Al convertirall_symbols
a 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_symbols
crea 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
include
mé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. end
Una nota adicional sobre los Koans: utilice
puts
declaraciones 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
words
podría ser, agregue la líneay ejecutar
rake
en 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