В about_symbols.rb Ruby Koan (https://github.com/edgecase/ruby_koans) у меня есть следующий код:
RubyConstant = "What is the sound of one hand clapping?"
def test_constants_become_symbols
all_symbols = Symbol.all_symbols
assert_equal true, all_symbols.include?(:"nonexistent")
assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?")
assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym)
end
Как есть, тест проходит.
Три вопроса:
-
Почему первое утверждение проходит?
:"nonexistent"
не следует включать в all_symbols, но он включен, поэтому я должен что-то недопонимать. -
Когда я комментирую второе утверждение, тест терпит неудачу, потому что
"What is the sound of one hand clapping?".to_sym
не включен во все_символы, тогда как:"What is the sound of one hand clapping?"
включен. Поскольку они эквивалентны, почему последнее утверждение терпит неудачу? Кроме того, почему это происходит, когда второе утверждение не закомментировано? (Почему второе утверждение влияет на третье утверждение?) -
Насколько я знаю, суть этого Ruby Koan заключалась в том, чтобы продемонстрировать, что константы становятся символами (по крайней мере, то, что я выводил из имени метода). Поскольку RubyConstant является константой со значением
"What is the sound of one hand clapping?"
, почему нет"What is the sound of one hand clapping?".to_sym
, включенного в список символов? Единственное объяснение, о котором я могу думать, это то, что, вопреки имени метода, константы фактически не становятся символами.
Спасибо за вашу помощь!