Houve uma discussão no grupo Rubyist local de rubis. Para obter a resposta real, onde e como os símbolos ruby são armazenados e assim por diante. Eu vasculhei a fonte de rubi para descobrir o que realmente está acontecendo por baixo.
Na verdade, esta é a estrutura principal que mantém todos os símbolos –
static struct symbols {
ID last_id;
st_table *sym_id;
st_table *id_str;
#if ENABLE_SELECTOR_NAMESPACE
st_table *ivar2_id;
st_table *id_ivar2;
#endif
VALUE op_sym[tLAST_OP_ID];
} global_symbols = {tLAST_TOKEN};
Tudo o que você escreve em seu rubi. ie. Nome da variável, $ global_variable, nome da classe, nome do método ou mesmo CONSTANTE tudo se transforma em símbolo e é adicionado a esta lista.
Além disso, é definido na gramática (como você viu em parse.y) e, portanto, é realmente iniciado quando a sintaxe “: Something” é usada e analisada por meio do analisador.
Assim, sempre que o parser começa, o símbolo fica povoado, Azharul Islam ficou surpreso quando Symbol.all.include?(:something_none_existing) => true
Para sua informação,
Este é o código original por trás de ‘Symbol.all_symbols’
rb_sym_all_symbols(void)
{
VALUE ary = rb_ary_new2(global_symbols.sym_id->num_entries);
st_foreach(global_symbols.sym_id, symbols_i, ary);
return ary;
}
🙂