хоха все правильно, но я попытаюсь немного расширить и уточнить.
Интерпретатор создаст символ :nonexistent
при разборе test_constants_become_symbols
.Затем, когда вы запускаете его, вызывается Symbol.all_symbols
, чтобы получить список всех известных символов, а :nonexistent
находится в списке.Также обратите внимание, что двойные кавычки в "nonexistent"
являются проблемой синтаксиса, а не внутренней проблемой представления, поэтому :nonexistent
и :"nonexistent"
- это одно и то же.
Если вы закомментируете это:
assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?")
, тогда символ :"What is the sound of one hand clapping?"
не будет виден синтаксическим анализатором и не будет в массиве all_symbols
.Вызов метода .to_sym
в следующей строке выполняется при выполнении test_constants_become_symbols
;Итак, символ :"What is the sound of one hand clapping?"
создается после того, как вы получите all_symbols
, и это не удастся:
assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym)
Если вы снова выполните test_constants_become_symbols
в том же экземпляре интерпретатора (со вторым assert_equal
все ещезакомментировано), тогда оба незакомментированных assert_equal
вызова пройдут, так как первый прогон через test_constants_become_symbols
создаст :"What is the sound of one hand clapping?"
, а второй Symbol.all_symbols
включит его в возвращенный массив.
Запуск вашего кода вirb
без включения в def
может помочь вам увидеть, что происходит.