Судя по тому, как сформулирован вопрос, вам, вероятно, следует переосмыслить дизайн ваших классов.Тем не менее, Ruby предоставляет интересный способ быстрого создания классов с attr_accessor
s (не читателями).Вот простой пример:
>> class Person < Struct.new(:name, :age) ; end
=> nil
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.age = 23
=> 23
>> p.class
=> Person
>> p.methods.grep(/age/)
=> [:age, :age=]
Конечно, это нормальный класс, и вы можете добавить все методы, которые вы хотите (и использовать геттеры и сеттеры вместо переменных экземпляра, например, var
для геттера и self.var = foo
для сеттера).
Если вы действительно не хотите авторов, сделайте их личными или undef
их.
>> attrs = [:name, :age]
=> [:name, :age]
>> class Person < Struct.new *attrs ; end
=> nil
>> Person.instance_eval { private *attrs.map{|attr| "#{attr}=" }}
=> Person
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.methods.grep(/age/)
=> [:age]
Все вышеперечисленное не помогает сконечно, множество назначений в initialize
, но потом возникает вопрос: действительно ли вы хотите использовать множество аргументов конструктора или, может быть, у вас есть только один аргумент хеш-функции и объединить его в хеш-код по умолчанию.