Mam na myśli ten test w about_symbols.rb w 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?
Dlaczego dokładnie musimy najpierw przekonwertować tę listę na ciągi?
Symbol.all_symbols
zmiennej do zmiennej, a następnie przetestowanie jej włączenia. Symbole są szybsze w porównaniu i unika się konwersji tysięcy symboli na łańcuchy.include?
Jeśli:test_method_names_become_symbols
określiliśmy, nie musielibyśmy konwertować wszystkich tych symboli na łańcuchy.:test_method_names_become_symbols
w porównaniu spowoduje jego utworzenie, więc porównanie zawsze będzie prawdziwe. Konwertującall_symbols
na łańcuchy i porównując łańcuchy, możemy odróżnić, czy symbol istniał przed porównaniem.Bo jeśli to zrobisz:
assert_equal true, all_symbols.include?(:test_method_names_become_symbols)
Może (w zależności od twojej implementacji ruby) automatycznie być prawdziwe, ponieważ
:test_method_names_become_symbols
tworzy symbol. Zobacz ten raport o błędzie .źródło
Obie powyższe odpowiedzi są poprawne, ale w świetle powyższego pytania Karthika pomyślałem, że opublikuję test, który ilustruje, jak dokładnie można przekazać symbol do
include
metodydef 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
Dodatkowa uwaga na temat Koanów: korzystaj z
puts
oświadczeń i niestandardowych testów, jeśli nic nie rozumiesz. Na przykład, jeśli widzisz:string = "the:rain:in:spain" words = string.split(/:/)
i nie mam pojęcia, co
words
może być, dodaj linięi uruchom
rake
w wierszu poleceń. Podobnie testy, takie jak ten, który dodałem powyżej, mogą być pomocne w zrozumieniu niektórych niuansów Rubiego.źródło