5 formas de criar um método de instância no Ruby

É certo que um método de instância é algo trivial, que definimos sempre que criamos nossas classes. No entanto, existem pelo menos mais 4 formas de se criar esses métodos e conhecê-los pode pode melhorar ainda mais suas habilidades em relação do Ruby.

Vamos começar pelo modo tradicional usando o def, através da definição de uma classe. Veja o exemplo:

class Pessoa
def falar_oi
puts "Oi!!!"
end
end
p = Pessoa.new
p.falar_oi
#=> Oi!!!

A segunda forma, dessa vez sem utilizar o def é…

class Pessoa
define_method :falar_oi do
puts "Oi!!!"
end
end
p = Pessoa.new
p.falar_oi
#=> Oi!!!

Esse formato permite que criemos uma espécie de “métodos dinâmicos”, visto que ele só é executado quando a classe é instanciada. Veja:

# pessoa.rb
class Pessoa
if [true,false].sample
define_method :falar do
puts "Falando!"
end
end
end
Pessoa.new.falar
-------
> ruby teste.rb 
Falando!
> ruby teste.rb 
Traceback (most recent call last):
teste.rb:8:in `<main>': undefined method `falar' for #<Pessoa:0x000000000202d0f8> (NoMethodError)

Como pode-se perceber, existe uma condicional proposital com 50% de chances de criar ou não o método falar. Observe que no nosso primeiro teste ele criou o método, já no segundo o método não foi criado.

A terceira forma é através de “Monkey Patch (estendendo a definição de uma classe existente). Vejamos.

class String
def falar_oi
puts "Oi!!!"
end
end
"Jackson".falar_oi
#=> Oi!!!

Lembre-se você pode “reabrir” qualquer classe no Ruby, inclusive as suas! 🙂

A nossa quarta forma de declaração de métodos é através do class_eval, que permite injetar em uma classe métodos no contexto da classe através de string ou bloco de código. Vamos usar string pura para testar.

class Pessoa
end
str = "def falar_oi() \"Oi!!!\" end"
Pessoa.class_eval(str)
Pessoa.new.falar_oi
#=> Oi!!!

Muito legal, hein! 🙂

E por fim, na quinta e última forma, usaremos method_missing.

class Pessoa
def method_missing(metodo, *params)
if metodo == :falar_oi
puts “Oi!!”
end
end
end
Pessoa.new.falar_oi
#=> Oi!!!

method_missing é um método que é executado sempre que um método que é invocado não existe, daí, no nosso caso, ele testa se o método invocado foi o método falar_oi e imprime a mensagem.

Ufa!! Essas cinco formas diferentes de declarar um método de instância nos ensinam muito, não é mesmo? 🙂

Enfim, mais uma vez espero que tenham gostado e sintam-se à vontade para deixar seus comentários.

Como sempre, não esqueçam de curtir nossa página no Facebook, nos seguir nas redes sociais e se inscrever em nossa newsletter semanal.

Até a próxima! 😉