class Here
def initialize
defineMe("RJ")
defineMe("SP")
end
def defineMe(dest)
define_method(dest) do
puts "Going here #{dest}"
end
end
end
h = Here.new
Só que não funciona:
C:\>ruby here.rb
here.rb:10:in `defineMe': undefined method `define_method' for #<Here:0x2838220>
(NoMethodError)
from here.rb:4:in `initialize'
from here.rb:16:in `new'
from here.rb:16
Ouvi falar que tem que definir como self.defineMe, mas não consegui fazer funcionar de jeito nenhum.
Alguma mente caridosa poderia me explicar o que é “def self.defineMe” e como fazer isso funcionar?
Simple.send( :define_method, 'my_method' ) do
p "esse é o my method"
end
Simple.send( :define_method, 'my_other_method' ) do |first_param, second_param|
p "esse é o outro metodo, parametros -> #{first_param} - #{second_param}"
end
end
end
novo = Simple.new
novo.my_method
novo.my_other_method( 1, 2 )[/code]
Seu primeiro exemplo não funconou porque não existe o método define_method na instância, só existe na classe. O exemplo do Linhares funciona porque ele manda uma mensagem para a classe e não para o objeto, e com send() você pode acessar métodos privados. o exemplo do rubinelli funciona porque ele define um método público na classe que acessa o método privado para voc6e.
Para explicar melhor, acontece o seguinte: Here é uma constante que aponta para um objeto da classe Class. Quando você faz “def Here.defineMe”, o runtime Ruby cria uma metaclasse para esse objeto, e insere o método que você especificou. A partir daí, quando você chama um método nesse objeto (que por acaso é do tipo Class), a metaclasse é a primeira a ser checada na árvore de herança para ver se existe esse método.