Executando verificação de segurança...
1

Metaprogramação em Ruby

Uma das características mais poderosas de Ruby é a sua capacidade de suportar a metaprogramação. A metaprogramação é a capacidade de um programa de alterar o seu próprio comportamento em tempo de execução. Em outras palavras, você pode escrever código que escreve código.

A metaprogramação em Ruby é possível por causa do suporte de duas ferramentas importantes: reflexão e eval.

Reflexão
A reflexão é a capacidade de um programa de inspecionar o seu próprio código em tempo de execução. Em Ruby, você pode usar métodos como class, methods, instance_variables e send para obter informações sobre o código que está sendo executado.

Por exemplo, o seguinte código Ruby usa a reflexão para imprimir o nome da classe de um objeto:

class Exemplo
end

objeto = Exemplo.new
puts objeto.class.name

Este código irá produzir a saída "Exemplo".

Eval
Eval é uma função em Ruby que permite que você avalie o código em tempo de execução. Com eval, você pode passar uma string contendo código Ruby como argumento e o Ruby irá executá-lo como se fosse código normal.

Por exemplo, o seguinte código Ruby usa eval para executar uma expressão matemática:

expressao = "2 + 2"
resultado = eval(expressao)
puts resultado

Este código irá produzir a saída "4".

Juntando reflexão e eval
Usando reflexão e eval em conjunto, você pode criar código que escreve código em tempo de execução. Isso pode ser muito útil para tarefas como criar classes e métodos dinamicamente, ou até mesmo estender classes existentes.

Por exemplo, o seguinte código Ruby usa a reflexão para definir um método em tempo de execução e eval para executar esse código:

class Exemplo
end

metodo = "def novo_metodo; puts 'Este é um novo método!'; end"
Exemplo.class_eval(metodo)

objeto = Exemplo.new
objeto.novo_metodo

Este código irá produzir a saída "Este é um novo método!".

Com a metaprogramação em Ruby, as possibilidades são infinitas. Você pode escrever código que se adapta dinamicamente às necessidades do seu programa, criando novos métodos, classes e até mesmo modificando o comportamento das classes existentes. Isso pode tornar o seu código mais flexível, mais fácil de ler e, em última análise, mais fácil de manter.

Carregando publicação patrocinada...
1

Showww, um outro uso da metaprogramação em Ruby é para criar métodos com menos verbosidade, exemplo:

  • Possuo uma classe Developer com o atributo "stack" (que pode ser "backend", "frontend", "devops" ou "fullstack")

Nesta classe posso criar métodos para verificar a stack do Developer da seguinte forma:

class Developer

    STACKS = ["backend", "frontend", "devops", "fullstack"].freeze
    
    STACKS.each do |stack|
      eval("def #{stack}?
        self.stack == '#{stack}'
      end")
    end
    
end

Desta forma, criamos um método de verificação para cada stack possível de um Developer, exemplo:

    john_doe = Developer.new(stack: "frontend")
    
    john_doe.backend?
    #false
    
    john_doe.frontend?
    #true
    
    john_doe.devops?
    #false
    
    john_doe.fullstack?
    #false