Ruby /
Metaprogramming /
Dynamics of Classes
Можно создавать классы динамически с помощью Class.new и Kernel.const_set -
new_class_definition = Class.new do
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "Hello, my name is #{@name} and I am #{@age} years old."
end
end
Kernel.const_set("Person", new_class_definition)
person = Person.new("Artem", 37)
person.greet
# => Hello, my name is Artem and I am 37 years old.
в Class.new можно передать в качестве аргумента родительский класс -
class Parent
end
Class.new(Parent)
Можно изменять класс с помощью метода class_eval-
Person.class_eval do
def initialize
end
def greet
puts "Hello from class_eval!"
end
end
obj = Person.new
obj.greet
# => Hello from class_eval!
А можно и изменить объект с помощью метода instance_eval -
obj = Object.new
obj.instance_eval do
def greet
puts "Hello from instance_eval!"
end
end
obj.greet
# => Hello from instance_eval!