class_exec выполнит блок для класса, class_eval строчку кода
%q{attr_reader(*attrs)}
subclass.class_eval str
instance_exec тоже для экземпляра класса принимает блок который может содержать аргумент, instance_eval содержит строку или блок но без аргумента.
в консольке пишем ruby demo.rb где:
demo.rb
require_relative 'base'
require_relative 'class1'
require_relative 'class2'
class1=MyClassOne.new
class2=MyClassTwo.new
puts class1.public_methods false
puts '='*20
puts class2.public_methods false
base.rb
class Base
require 'json'
class << self
def inherited(subclass)
attrs = attributes_for subclass
subclass.class_exec do
attr_reader(*attrs)
end
end
#super
private
def attributes_for(klass)
@methods = JSON(File.read('./data.json'))
@methods[klass.to_s.downcase]
end
end
end
class1.rb
class MyClassOne < Base
end
class2.rb
class MyClassTwo < Base
end
data.json
{
"myclassone": [
"method1",
"method2",
"method3",
"method4",
"method5",
"method6",
"method7",
"method8"
],
"myclasstwo": [
"method11",
"method12",
"method13",
"method14",
"method15",
"method16",
"method17",
"method18"
]
}