Estou me referindo a este teste em about_symbols.rb em 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 que exatamente temos que converter essa lista em strings primeiro?
Symbol.all_symbols
a uma variável e, em seguida, testar a inclusão. Os símbolos são mais rápidos na comparação e você evita converter milhares de símbolos em strings.include?
Se especificássemos:test_method_names_become_symbols
, não teríamos que converter todos esses símbolos em strings.:test_method_names_become_symbols
na comparação vai criá-lo, então a comparação sempre será verdadeira. Ao converterall_symbols
em strings e comparar strings, podemos distinguir se o símbolo existia antes da comparação.Porque se você fizer:
assert_equal true, all_symbols.include?(:test_method_names_become_symbols)
Pode (dependendo de sua implementação de ruby) ser verdadeiro automaticamente, porque
:test_method_names_become_symbols
cria o símbolo. Veja este relatório de bug .fonte
As duas respostas acima estão corretas, mas à luz da pergunta de Karthik acima, pensei em postar um teste que ilustrasse como alguém pode passar com precisão um símbolo para o
include
métododef 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
Uma observação adicional sobre os Koans: faça uso de
puts
instruções, bem como testes personalizados, se você não entender nada. Por exemplo, se você vir:string = "the:rain:in:spain" words = string.split(/:/)
e não tenho ideia do que
words
pode ser, adicione a linhae corra
rake
na linha de comando. Da mesma forma, testes como o que adicionei acima podem ser úteis em termos de compreensão de algumas das nuances do Ruby.fonte