Я имею в виду этот тест в about_symbols.rb в 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?
Почему мы должны сначала преобразовать этот список в строки?
Symbol.all_symbols
переменной, а затем проверить на включение. Символы быстрее сравниваются, и вы избегаете преобразования тысяч символов в строки.include?
если мы указали,:test_method_names_become_symbols
нам не нужно было бы преобразовывать все эти символы в строки.:test_method_names_become_symbols
в сравнении создаст ее, поэтому сравнение всегда будет истинным. Преобразовываяall_symbols
в строки и сравнивая строки, мы можем определить, существовал ли символ до сравнения.Потому что, если вы это сделаете:
assert_equal true, all_symbols.include?(:test_method_names_become_symbols)
Это может (в зависимости от вашей реализации ruby) автоматически быть истинным, потому что
:test_method_names_become_symbols
создает символ. См. Этот отчет об ошибке .источник
Оба приведенных выше ответа верны, но в свете вопроса Картика выше я подумал, что опубликую тест, который показывает, как можно точно передать символ
include
методу.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
Дополнительное примечание о Коанах: используйте
puts
инструкции, а также специальные тесты, если вы ничего не понимаете. Например, если вы видите:string = "the:rain:in:spain" words = string.split(/:/)
и понятия не имею, что
words
может быть, добавьте строкуи запустить
rake
в командной строке. Точно так же тесты, подобные тому, который я добавил выше, могут быть полезны с точки зрения понимания некоторых нюансов Ruby.источник