Как сделать 'attr_reader' или 'attr_writer' для всех переменных класса одновременно? - PullRequest
4 голосов
/ 25 февраля 2011

Я использую Ruby on Rails 3 и, поскольку у меня есть объявленный класс с большим количеством переменных, я бы объявил все 'attr_reader' или 'attr_writer' для этих переменных класса за один раз .

Я пытался

class Persone
  attr_reader :all

  def initialize(name, surname, ...)
    @name = name
    @surname = surname
    ... # A lot of variables!
  end
end

, но это не работает.

Ответы [ 6 ]

3 голосов
/ 25 февраля 2011
class Persone
  INSTANCE_VARS = [:name,:surname]
  attr_reader *INSTANCE_VARS

  def initialize(*params)
    params.each_with_index do |param,index|
      instance_variable_set("@"+INSTANCE_VARS[index].to_s,param)
    end
  end
end
2 голосов
/ 25 февраля 2011

То, что вы должны использовать:

attr_accesor :name, :surname, ...

def initialize(name, surname, ...)
  @name = name
  @surname = surname
  ...
end

Таким образом, вы получите установщик и получатель всего за один шаг, но вам все равно придется перечислить все имена этих переменных.

1 голос
/ 06 декабря 2011

Ответ может быть поздно, но поздно лучше, чем никогда:

class Persone    
  def initialize(name, surname, ...)
    @name = name
    @surname = surname
    ... # A lot of variables!

    instance_variables.each do |var|
        eval "def #{var.to_s.sub('@', '')}; #{i}; end"
    end
  end
end
1 голос
/ 25 февраля 2011

Взгляните на Struct класс:

Persone = Struct.new :name, :surname, :address

p = Persone.new 'John', 'Smith', '12 Street 345'
puts p.address
0 голосов
/ 31 декабря 2011

блок instance_variable имел опечатку в примере Криса Вутерса ...

instance_variables.each do |var|
    eval "def #{var.to_s.sub('@', '')}\n #{var}; end"
  end
0 голосов
/ 26 февраля 2011
class Persone

  VARS = [:name, :surname, ...]

  VARS.each{|var|
    attr_reader var
  }

  def initialize(params)
    params.each_pair{|key,value|
       self.instance_variable_set("@#{key}".to_sym, value
    }
  end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...