La metaprogramació és una tècnica avançada en Ruby que permet al codi escriure codi. Això significa que pots crear mètodes i classes dinàmicament durant l'execució del programa. Aquesta capacitat fa que Ruby sigui extremadament flexible i potent, però també pot complicar el codi si no es fa servir amb cura.
Conceptes Clau
- Definició Dinàmica de Mètodes: Crear mètodes durant l'execució del programa.
define_method: Un mètode que permet definir altres mètodes dinàmicament.method_missing: Captura les trucades a mètodes que no existeixen.sendi__send__: Permet trucar a mètodes, incloent-hi els privats.eval: Executa codi Ruby que es passa com a cadena de text.
Definició Dinàmica de Mètodes
define_method
El mètode define_method permet definir mètodes dinàmicament. Aquí tens un exemple:
class Persona
def initialize(nom)
@nom = nom
end
define_method(:saluda) do
"Hola, #{@nom}!"
end
end
persona = Persona.new("Anna")
puts persona.saluda # Sortida: Hola, Anna!method_missing
El mètode method_missing es crida quan es fa una trucada a un mètode que no existeix. Això permet capturar aquestes trucades i gestionar-les de manera personalitzada.
class Persona
def method_missing(metode, *args)
puts "El mètode #{metode} no existeix, però aquí tens els arguments: #{args.join(', ')}"
end
end
persona = Persona.new
persona.saluda("Anna") # Sortida: El mètode saluda no existeix, però aquí tens els arguments: Annasend i __send__
Els mètodes send i __send__ permeten trucar a mètodes, incloent-hi els privats. Això pot ser útil en situacions on necessites accedir a mètodes privats des de fora de la classe.
class Persona
private
def secret
"Aquest és un secret!"
end
end
persona = Persona.new
puts persona.send(:secret) # Sortida: Aquest és un secret!eval
El mètode eval permet executar codi Ruby que es passa com a cadena de text. Això pot ser molt potent, però també perillós si s'utilitza amb dades no confiables.
Exercicis Pràctics
Exercici 1: Definició Dinàmica de Mètodes
Crea una classe Calculadora que defineixi dinàmicament mètodes per sumar, restar, multiplicar i dividir dos números.
class Calculadora
[:suma, :resta, :multiplica, :divideix].each do |operacio|
define_method(operacio) do |a, b|
case operacio
when :suma
a + b
when :resta
a - b
when :multiplica
a * b
when :divideix
a / b
end
end
end
end
calculadora = Calculadora.new
puts calculadora.suma(5, 3) # Sortida: 8
puts calculadora.resta(5, 3) # Sortida: 2
puts calculadora.multiplica(5, 3) # Sortida: 15
puts calculadora.divideix(6, 3) # Sortida: 2Exercici 2: method_missing
Crea una classe Persona que utilitzi method_missing per gestionar trucades a mètodes inexistents i imprimeixi un missatge personalitzat.
class Persona
def method_missing(metode, *args)
puts "El mètode #{metode} no existeix, però aquí tens els arguments: #{args.join(', ')}"
end
end
persona = Persona.new
persona.diu("Hola") # Sortida: El mètode diu no existeix, però aquí tens els arguments: HolaResum
La metaprogramació en Ruby és una eina poderosa que permet crear codi dinàmicament. Hem vist com utilitzar define_method per definir mètodes dinàmicament, method_missing per capturar trucades a mètodes inexistents, send per trucar a mètodes privats i eval per executar codi Ruby des de cadenes de text. Aquests conceptes són fonamentals per aprofitar al màxim la flexibilitat de Ruby, però s'han d'utilitzar amb cura per evitar complicacions innecessàries en el codi.
Curs de Programació en Ruby
Mòdul 1: Introducció a Ruby
Mòdul 2: Conceptes Bàsics de Ruby
Mòdul 3: Treballant amb Col·leccions
Mòdul 4: Programació Orientada a Objectes en Ruby
- Classes i Objectes
- Variables i Mètodes d'Instància
- Variables i Mètodes de Classe
- Herència
- Mòduls i Mixins
Mòdul 5: Conceptes Avançats de Ruby
- Blocs, Procs i Lambdas
- Metaprogramació
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Expressions Regulars
Mòdul 6: Introducció a Ruby on Rails
- Què és Ruby on Rails?
- Configuració de l'Entorn Rails
- Creació d'una Aplicació Simple en Rails
- Arquitectura MVC
- Rutes
Mòdul 7: Proves en Ruby
- Introducció a les Proves
- Proves Unitàries amb Minitest
- Desenvolupament Basat en Comportament amb RSpec
- Mocking i Stubbing
Mòdul 8: Millors Pràctiques en Ruby
- Estil de Codi i Convencions
- Refactorització
- Optimització del Rendiment
- Millors Pràctiques de Seguretat
