Símbolos Ruby (MRI). eles estão em toda parte! mesmo: | um símbolo.

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 –

Fonte Ruby do Github

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,

Fonte Ruby do Github

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;
}

🙂