2010-05-13 83 views
1

我正在學習Ruby,我的大腦剛剛凍結。如何在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 

回答

6

您可以通過附加等號方法名的最後一個定義:

def self.total_people=(v) 
    @@total_people = v 
end 

你把所有實例@@ current_people你可以更準確地定義total_people:

def self.total_people 
    @@current_people.length 
end 

並擺脫所有與@@ total_people相關的代碼。

沒有工作
0

一種方法是如下:

module PersonClassAttributes 
    attr_writer :nationalities 
end 

class Person 
    extend PersonClassAttributes 
end 

我懷疑這是因爲attr_writer不會出於某種原因模塊工作。

我想知道是否有一些元編程方法來解決這個問題。但是,您是否考慮過創建一個包含人員列表的對象?

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與繼承類變量的陷阱中 - 子類不能覆蓋類變種的父級的值。 A class instance variable可能真的是你想要的,而這個解決方案就是朝着這個方向發展的。

相關問題