sábado, 16 de agosto de 2008

Definir métodos dinámicamente en ruby

Ruby permite la definición dinámica de métodos, para ello hay varios métodos en Class que nos ayudan.

#!/usr/bin/ruby

class Clase
end

objeto = Clase.new

Clase.send :define_method, :saludo do
puts "Hola mundo"
end

objeto.saludo if Clase.method_defined?(:saludo)

Clase.send :undef_method, :saludo

# Tambien puede usarse:
# Clase.send :remove_method, :saludo

objeto.saludo if Clase.method_defined?(:saludo)

Mediante :define_method se define dinámicamente el método saludo y luego vemos como mediante :undef_method lo podemos eliminar. Con method_defined? consultamos si el método está definido en ese momento o no.

Lo de ejecutar los métodos :define_method y :undef_method mediante send es porque son privados.

¿Qué ventajas puede tener definir los métodos dinámicamente? Pues la primera es que se puede elegir el nombre de los métodos añadidos dinámicamente ya que en lugar de símbolos como nombres también aceptan cadenas. No es una gran ventaja, pero puede ser útil en algún caso.

Además de eso donde si puede resultar muy útil la definición automática de métodos es en programas en los que las acciones posibles a ejecutar evolucionen con el tiempo.

Puede parecer que son situaciones muy rebuscadas, pero no lo son tanto, sería útil en la gran mayoría de juegos de rol, según la ocasión el protagonista puede realizar unas acciones y no otras.

0 comentarios: