El siguiente es un fragmento de código de Ruby de Why's Poignant Guide to Ruby Chapter 6, donde se intenta demostrar metaprogramming en Ruby:¿Qué hace este código de Ruby ?: def self.metaclass; clase << uno mismo; yo; fin; final
# Get a metaclass for this class
def self.metaclass; class << self; self; end; end
no estoy tan bien familiarizado con Ruby, pero ¿es esto lo que se vería en forma expandida?
def self.metaclass
def self.self
end
end
Al menos así es como yo lo entiendo. Sin embargo, todavía no comprende lo que hace este código, exactamente. ¿Cuál es su propósito?
Más adelante en el código, qué añade esto:
arr.each do |a|
metaclass.instance_eval do
define_method(a) do |val|
@traits ||= {}
@traits[a] = val
end
end
end
Si he entendido bien, esta pieza de código añade un nuevo valor a @traits con el nombre y el valor dado. ¿Es eso correcto?
Gracias por su ayuda, aquí está el código fuente completo que me causó problemas, para cualquier persona que quiera verlo:
# The guts of life force within Dwemthy's Array
class Creature
# Get a metaclass for this class
def self.metaclass; class << self; self; end; end
# Advanced metaprogramming code for nice, clean traits
def self.traits(*arr)
return @traits if arr.empty?
# 1. Set up accessors for each variable
attr_accessor *arr
# 2. Add a new class method to for each trait.
arr.each do |a|
metaclass.instance_eval do
define_method(a) do |val|
@traits ||= {}
@traits[a] = val
end
end
end
# 3. For each monster, the `initialize' method
# should use the default number for each trait.
class_eval do
define_method(:initialize) do
self.class.traits.each do |k,v|
instance_variable_set("@#{k}", v)
end
end
end
end
# Creature attributes are read-only
traits :life, :strength, :charisma, :weapon
end
Y en uso:
class Dragon < Creature
life(1340) # tough scales
strength(451) # bristling veins
charisma(1020) # toothy smile
weapon(939) # fire breath
end
Lea esto: http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/ – Phrogz
Gracias, esto parece útil. Pero realmente me gustaría entender el significado de def self.metaclass; clase << uno mismo; yo; fin; fin. – LonelyWebCrawler