我正在研究Ruby,我的大脑就冻结了。
在下面的代码中,我如何为'self.total_people'编写类编写器方法?我正试图“计算”班级“人物”的实例数量。
class Person
attr_accessor :name, :age
@@nationalities = ['French', 'American', 'Colombian', 'Japanese', 'Russian', 'Peruvian']
@@current_people = []
@@total_people = 0
def self.nationalities #reader
@@nationalities
end
def self.nationalities=(array=[]) #writer
@@nationalities = array
end
def self.current_people #reader
@@current_people
end
def self.total_people #reader
@@total_people
end
def self.total_people #writer
#-----?????
end
def self.create_with_attributes(name, age)
person = self.new(name)
person.age = age
person.name = name
return person
end
def initialize(name="Bob", age=0)
@name = name
@age = age
puts "A new person has been instantiated."
@@total_people =+ 1
@@current_people << self
end
答案 0 :(得分:7)
您可以通过在方法名称的末尾附加等号来定义一个:
def self.total_people=(v)
@@total_people = v
end
您将所有实例放在@@ current_people中,您可以更准确地定义total_people:
def self.total_people
@@current_people.length
end
并删除所有@@ total_people相关代码。
答案 1 :(得分:4)
我认为这可以解决您的问题:
class Person
class << self
attr_accessor :foobar
end
self.foobar = 'hello'
end
p Person.foobar # hello
Person.foobar = 1
p Person.foobar # 1
请注意Ruby的类变量带有继承的问题 - 子类不能覆盖类var的父类值。 class instance variable可能真的是你想要的,这个解决方案朝这个方向发展。
答案 2 :(得分:0)
一种不起作用的方法如下:
module PersonClassAttributes
attr_writer :nationalities
end
class Person
extend PersonClassAttributes
end
我怀疑是因为attr_writer由于某种原因无法使用模块。
我想知道是否有一些元编程方法可以解决这个问题。但是,您是否考虑过创建包含人员列表的对象?