Palavras-chave: Ruby, Fixnum, object_id
Em Ruby podemos facilmente verificar se um objeto é da classe Fixnum através do seu object_id (os números podem variar):
s = "oi" s.object_id => -605527578 n = 123456 n.object_id => 246913 s.object_id & 0x1 => 0 n.object_id & 0x1 => 1
Fazendo um and com o object_id e 0x1, somente os objetos da classe Fixnum irão retornar 1.
uau… isso é interessante.
Parece mágica… TaQ, você se importaria de desmistificar isso?
Na verdade, foi apenas uma ótima sacada do Matz. Sempre que a gente cria um Fixnum o object_id ele automaticamente usa um número que tem o último bit na direita ativo, e inativo para os outros tipos. Olha só:
[taq@~]irb
irb(main):001:0> s = “oi”
=> “oi”
irb(main):002:0> s.object_id.to_s(2)
=> “-100100000101000000011000011010”
irb(main):003:0> n = 123456
=> 123456
irb(main):004:0> n.object_id.to_s(2)
=> “111100010010000001”
A sacada genial foi aproveitar o número para carregar informação extra. Tem mais uma informação extra ali que vai virar dica provavelmente nessa semana, fique de olho. :-)