2012-11-09 10 views
18

Ich möchte einen Options-Hash als Eingabe für eine Methode in Ruby verwenden, aber gibt es eine Möglichkeit, alle gleichnamigen Variablen (d. H. Mit demselben Namen) schnell zu setzen, statt sie einzeln einzustellen?Schnell Instanzvariablen mit Optionen Hash in Ruby setzen?

Anstatt also die von folgenden Aktionen ausführen:

class Connection 
    def initialize(opts={}) 
    @host  = opts[:host] 
    @user  = opts[:user] 
    @password = opts[:password] 
    @project = opts[:project] 
    # ad nauseum... 

gibt es einen Einzeiler, das jede eingehende Option in der Hash auf die Variable mit dem gleichen Namen zuweisen?

+0

möglich Duplikat (http://stackoverflow.com/ Fragen/9597249/in-ruby-kann-ich-automatisch-Instanz-Variablen-irgendwie-in-der-Initialisierung-populate) – mydoghasworms

Antwort

43
def initialize(opts={}) 
    opts.each { |k,v| instance_variable_set("@#{k}", v) } 
end 
+0

Danke, ich habe gerade gefunden: http://stackoverflow.com/questions/9597249/in- ruby-kann-ich-automatisch-füllen-instance-Variablen-irgendwie-in-der-Initialisierung/10855962 was genau Sie auch sagen. Ich werde meine Frage als Duplikat schließen, aber deine Antwort verbessern. – mydoghasworms

+3

Whitelisting der Schlüssel wäre eine gute Ergänzung, ein paar Sekunden, um die Whitelist einrichten jetzt könnte Stunden der Debugging-Zeit später speichern und helfen, die Schnittstelle als Nebeneffekt zu dokumentieren. –

3

Dies sollte Sie geben, was Sie suchen:

def initialize(opts={}) 
    opts.each_pair do |key, value| 
    send("#{key}=",value) 
    end 
end 
+1

Dies funktioniert nur, wenn Sie über 'attr_accessor',' attr_writer' oder manuell erstellte 'setter' Methoden' setter' Methoden haben – ptierno

1

Sie tun dies,

@host, @user, @password, @project = opts[:host], opts[:user], opts[:password], opts[:project] 

hoffe, das hilft!

1

Neben Casper-Lösung, können Sie auch das zucker Juwel verwenden: [? In Ruby kann ich automatisch Instanzvariablen irgendwie in der Methode initialize bevölkern]

instance_variables_from(opts)