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