Как мне написать метод записи для переменной класса в Ruby? - PullRequest
1 голос
/ 13 мая 2010

Я изучаю Руби, и мой мозг просто замерз.

Как в следующем коде написать метод записи класса для 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 ]

7 голосов
/ 13 мая 2010

Вы можете определить его, добавив знак равенства в конец имени метода:

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

Вы помещаете все экземпляры в @@ current_people, чтобы вы могли более точно определить total_people:

def self.total_people
  @@current_people.length
end

И избавьтесь от всего кода, связанного с @@ total_people.

4 голосов
/ 14 мая 2010

Я думаю, что это решит вашу проблему:

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. переменная экземпляра класса действительно может быть тем, что вам нужно, и это решение идет в этом направлении.

0 голосов
/ 14 мая 2010

Один из подходов, который не сработал, был следующий:

module PersonClassAttributes
  attr_writer :nationalities
end

class Person
  extend PersonClassAttributes
end

Я подозреваю, что это потому, что attr_writer по какой-то причине не работает с модулями.

Я хотел бы знать, есть ли какой-нибудь способ метапрограммирования, чтобы приблизиться к этому. Однако рассматривали ли вы создание объекта, который содержит список людей?

...