Ruby начинает капризничать, когда вы пытаетесь инициализировать ReligiousPerson или PolitPerson, конечно,
Я думаю, что более вероятно, что он выдает ошибку, когда вы пытаетесь определить ReligiousPerson
и PoliticalPerson
.Это потому, что Person(:religion)
выглядит как попытка вызвать Person
, как если бы это была функция.Очевидно, это не сработает, потому что Person
- это класс.
Совершенно верно, хотя для подкласса Person:
class ReligiousPerson < Person
attr_accessor :religion
def initialize(name, last_name, religion)
super(name, last_name)
@religion = religion
end
end
pious_person = ReligiousPerson.new('billy', 'bill', 'Zoroastrianism')
pious_person.religion #=> "Zoroastrianism"
Struct.new
, кстати, ничего особенного не делает, просто динамически создает класс на основе значений, которые вы ему передаете,Затем вы создаете новый класс (Person
), который подклассов класса, созданного Struct.new
:
new_struct = Struct.new(:name, :last_name)
class Person < new_struct
end
Person.superclass == new_struct #=> true
Кроме того, вы можете обратить внимание на это свойство некоторых из предыдущихответы:
class Person < Struct.new(:name, :last_name)
end
class ReligiousPerson < Struct.new(*Person.members, :religion)
end
ReligiousPerson.ancestors.include?(Struct) #=> true
ReligiousPerson.ancestors.include?(Person) #=> false
Если вы сделаете это таким образом, ReligiousPerson
на самом деле не подкласс Person
.