3 Stimmen

Ruby-Methode mit Argument Hash mit Standardwerten: wie DRY?

Ich habe eine initialize Methode, die einen Hash akzeptiert, um einige Instanzvariablen zu setzen. Dies ist im Grunde, was ich zu tun versuche:

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

Ich habe einen Tipp gesehen, wie man Instanzvariablen dynamisch setzen kann, aber ich bin mir nicht sicher, wie man auch die Standardwerte einbezieht...

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

Kann ich mich dynamisch auf eine Konstante beziehen? Oder gibt es bessere Möglichkeiten, diese Art von Dingen zu tun, sind willkommen!

... Mir ist auch klar, dass attr_accessor Variablen können individuell eingestellt werden. Aber ich möchte es einfach so machen :)

10voto

Jorge Israel Peña Punkte 34514

Auch hier werden die Instanzvariablen nur erstellt, wenn sie in Ihrer defaults Hash, so dass Sie nicht versehentlich andere Instanzvariablen erstellen/überschreiben.

Ich nehme an, Sie wollten sagen unless val.nil? :

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

1voto

Harish Shetty Punkte 63187

Versuchen Sie dies:

  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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X