Судя по тому, как сформулирован вопрос, вы должны, вероятно, переосмыслить дизайн своих классов. Тем не менее, 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
конечно, но тогда возникает вопрос, если вы действительно хотите много аргументов конструктора или, если возможно, вы просто один хэш аргумента и объединить, что в хэш по умолчанию.
Что именно вы пытаетесь сделать? Конструктор с 50 параметрами является уродливым на любом языке. –
Не то, чтобы я хотел включить что-то, что уже было включено, я просто хочу иметь возможность определять переменную экземпляра при вызове new в классе ('@bar = bar'), установить значение по умолчанию для нового (bar = nil) и сделать его доступным ('attr_reader'), не повторяя мое собственное три раза – rudolph9