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!