Метод Ruby с хешем аргументов со значениями по умолчанию: как СУХОЙ? - PullRequest
2 голосов
/ 09 мая 2011

У меня есть метод initialize, который принимает хеш для установки некоторых переменных экземпляра.Это в основном то, что я пытаюсь сделать:

class Ad
  DEFAULT_PAGE = 'index'.freeze

  DEFAULT_CHANNEL = 'general'.freeze

  DEFAULT_AREA = 'general'.freeze

  attr_accessor :page, :area, :channel

  def initialize args={}
    @page = args[:page] || DEFAULT_PAGE
    @area = args[:area] || DEFAULT_AREA
    @channel = args[:channel] || DEFAULT_CHANNEL
  end

  # ...
end

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

  def initialize args={}
    args.each do |attr,val|
      instance_variable_set("@#{attr}", val) unless val.nil?
    end
  end

Можно ли динамически ссылаться на константу?Или любые лучшие способы делать подобные вещи приветствуются!

... Я также понимаю, что attr_accessor переменные могут быть установлены индивидуально.Но я просто хочу сделать это так.:)

Ответы [ 2 ]

9 голосов
/ 09 мая 2011

Эта переменная также создает переменные экземпляра только в том случае, если они находятся в вашем хэше defaults, поэтому вы не можете случайно создать / перезаписать другие переменные экземпляра.1004 *:

def initialize(args={})
  defaults = {
    :page    => DEFAULT_PAGE,
    :area    => DEFAULT_AREA,
    :channel => DEFAULT_CHANNEL
  }.merge(args).each do |attr, val|
    instance_variable_set("@#{attr}", val) if defaults.has_key?(attr) && (not val.nil?)
  end if args
end
1 голос
/ 09 мая 2011

Попробуйте это:

  def initialize args={}
    defaults = {
      :page    => DEFAULT_AREA, 
      :area    => DEFAULT_AREA, 
      :channel => DEFAULT_CHANNEL
    }
    args.reverse_merge(defaults).each do |attr,val|
      instance_variable_set("@#{attr}", val) unless val.nil?
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...