2013-05-15 70 views
27

我看到一些庫方法中使用的哈希參數,因爲我一直在學習。方法在Ruby中如何使用散列參數?

例如,

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

有人能解釋的方法是如何使用的參數是這樣,你怎麼可以創建利用了哈希參數的方法?

回答

40

例子:

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) 

我用hash={}指定的最後一個參數是一個哈希,空哈希的默認值。現在,當我寫:

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

它實際上是一個語法糖:

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

此外,{a: 12}{:a => 12}語法糖。

當所有這些組合在一起時,會得到一種與其他語言中的命名參數類似的語法。

+0

U搖滾人!謝謝:) – facundofarias

+0

謝謝,很好地解釋:D +1 –

3

我會做的兩個選項之一:

1,如果有大量的參數傳遞到一個方法,我會使用散列這樣的:

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

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

def some_method(hash_options) 
    #important code 
end 

2-選項會更「傳統的」

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

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

這一個啓用多行!感謝@ M.Octavio! 'some_method({titles =>'titulo',genre =>'jazz',duration_less_than => 270})' – GatoCurioso

11

當一個Ruby方法調用的參數列表中的一個或多個鍵 - 值對結束時,像foo: 'bar''foo' => 1,紅寶石組織在一起成爲一個單一的散列並將該散列作爲最後一個參數。你可以看到自己在irb

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

因此,你可以在最後的,可選的參數添加到你寫接收該散列的方法。你通常會想把它默認爲一個空的散列。你可以打電話給你想要的參數什麼,但options是一個共同的名字:

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

一個有用的技巧,如果你正在使用的Rails:常常是很方便的把普通字符串和符號等同。 Rails添加一個symbolize_keys!方法Hash所有字符串鍵轉換爲符號:

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

對於'symbolize_keys! – aL3xa

24

在Ruby 2.x中,你可以使用**哈希圖示:

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

這是我要做的事:

def my_method(title, args) 
    puts title 
    puts args 

傳遞參數:

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