14.3.07

Ruby para Javeiros: classForName()

Um dos recursos mais utilizados do pacote de reflection do Java, o classForName permite instanciar uma classe sabendo apenas o seu nome. Praticamente todo programador Java já utilizou este método - mesmo que sem perceber, para localizar drivers JDBC.
No Ruby, classes são símbolos - e a sua carga dinâmica pode ser feita da mesma forma que qualquer outro símbolo: utilizando-se o método const_get(), definido na classe Module.
O fato de basicamente tudo no Ruby "extender" Module de uma forma ou de outra faz com que o const_get() possa ser usado de maneiras bem feias: trata-se basicamente de um método estático de qualquer classe!
Um exemplo básico de como inicializar uma classe a partir de seu nome:

class Bla
def initialize
puts "tada!"
end
end

instancia = Module.const_get("Bla")
puts instancia.class => "Bla"


ou então, quem sabe, de um jeio mais elegante:

instancia = Kernel.const_get(:Bla)

Bonito. Mas ei, e se meu objetivo for escrever código ilegível???

instancia = "yadayada".class.const_get "Bla"

ah... Muito melhor agora. As vezes essa flexibilidade toda do Ruby cai como uma bela feijoada antes de dormir...

Um comentário:

tautologico disse...

Herval, vejo por esse blog que você está menos javaboy, o que é uma coisa boa. Ruby é legal, um pouco mais legal que Python, embora menos legal que Haskell.

E Java dá sono.