如何在Ruby中为类变量编写writer方法?

时间:2010-05-13 15:11:05

标签: ruby oop class metaprogramming

我正在研究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

3 个答案:

答案 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由于某种原因无法使用模块。

我想知道是否有一些元编程方法可以解决这个问题。但是,您是否考虑过创建包含人员列表的对象?