2013-05-15 10 views
27

Ich sah Hash-Argumente in einigen Bibliotheksmethoden verwendet, wie ich gelernt habe.Wie verwenden Methoden Hash-Argumente in Ruby?

Z. B.

list.search(:titles, genre: 'jazz', duration_less_than: 270) 

Kann jemand erklären, wie ein Verfahren Argumente wie diese verwendet, und wie könnten Sie eine Methode erstellen, die Verwendung von Hash Argumente macht?

Antwort

40

Beispiel:

def foo(regular, hash={}) 
    puts "regular: #{regular}" 
    puts "hash: #{hash}" 
    puts "a: #{hash[:a]}" 
    puts "b: #{hash[:b]}" 
end 

foo("regular argument", a: 12, :b => 13) 

I verwenden hash={} angeben, dass das letzte Argument ein Hash ist, mit Standardwert der leeren hash. Nun, wenn ich schreibe:

foo("regular argument", a: 12, :b => 13) 

Es ist eigentlich ein syntaktischer Zucker für:

foo("regular argument", {a: 12, :b => 13}) 

Auch ist {a: 12} syntaktischer Zucker für {:a => 12}.

Wenn all dies kombiniert ist, erhalten Sie eine Syntax, die den benannten Argumenten in anderen Sprachen ähnelt.

+0

U Rock Mann! Danke :) – facundofarias

+0

Danke, gut erklärt: D +1 –

3

ich eine von zwei Optionen tun würde:

some_method({titles => 'titulo', genre => 'jazz', duration_less_than => 270}) 

oder

:

1- wenn eine bekam eine große Anzahl von Argumenten in eine Methode zu übergeben ich einen Hash wie folgt verwenden würde

my_hash = {titles => 'titulo', genre => 'jazz', duration_less_than => 270} 
some_method(my_hash) 

und

def some_method(hash_options) 
    #important code 
end 

2- Option wird mehr ‚traditionelle‘

some_method('titulo', 'jazz', 270) 

def some_method(titles, genre, duration_less_than) 
#important code 
end 
+0

Dieser ermöglicht Multiline! Danke für dieses @ M.Octavio! 'some_method ({titles => 'titulo', genre => 'jazz', duration_less_than => 270})' – GatoCurioso

11

Wenn eine Argumentliste Ruby Methodenaufruf in einen oder mehrere Schlüssel-Wert-Paare endet, wie foo: 'bar' oder 'foo' => 1 sammelt Rubin sie alle in einem einzigen Hash und leitet, dass Hash als letzter Parameter. Sie können, dass sich in irb sehen:

irb(main):002:0> puts foo: 'bar', baz: 'quux' 
{:foo=>"bar", :baz=>"quux"} 
=> nil 

So können Sie einen letzten, optionalen Parameter ein Verfahren fügen Sie diesen Hash zu erhalten sind zu schreiben. Normalerweise möchten Sie es auf einen leeren Hash setzen. Sie können den Parameter etwas rufen Sie wollen, aber options ist ein gebräuchlicher Name:

def my_method(a, b, c, options = {}) 
    ... 
end 

Ein nützlicher Trick, wenn Sie verwenden Rails: Es ist oft praktisch, blanke Saiten und Symbole als gleichwertig zu behandeln. Rails fügt eine symbolize_keys! Methode Hash alle String-Schlüssel zu Symbolen konvertieren:

def my_method(a, b, c, options = {}) 
    options.symbolize_keys! 
    ... 
end 
+0

+1 für 'symbolize_keys!' – aL3xa

24

In Ruby 2.x Sie ** Hash Splat verwenden können:

def foo(ordered_argument, **named_arguments) 
    puts "Ordered argument: #{ordered_argument}" 
    puts "Named arguments: #{named_arguments}" 
end 

foo(:titles, genre: 'jazz', duration_less_than: 270) 
#=> Ordered argument: titles 
#=> Named arguments: {:genre=>"jazz", :duration_less_than=>270} 
1

Dies ist, wie ich es tun:

def my_method(title, args) 
    puts title 
    puts args 

Gabe von Parametern:

my_method('test title', a: 'foo', b: 'bar') 
    # => test title 
    # => '{:a => 'foo', :b => 'bar'}