我看到一些庫方法中使用的哈希參數,因爲我一直在學習。方法在Ruby中如何使用散列參數?
例如,
list.search(:titles, genre: 'jazz', duration_less_than: 270)
有人能解釋的方法是如何使用的參數是這樣,你怎麼可以創建利用了哈希參數的方法?
我看到一些庫方法中使用的哈希參數,因爲我一直在學習。方法在Ruby中如何使用散列參數?
例如,
list.search(:titles, genre: 'jazz', duration_less_than: 270)
有人能解釋的方法是如何使用的參數是這樣,你怎麼可以創建利用了哈希參數的方法?
例子:
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}
語法糖。
當所有這些組合在一起時,會得到一種與其他語言中的命名參數類似的語法。
我會做的兩個選項之一:
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
這一個啓用多行!感謝@ M.Octavio! 'some_method({titles =>'titulo',genre =>'jazz',duration_less_than => 270})' – GatoCurioso
當一個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
對於'symbolize_keys! – aL3xa
在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}
由於紅寶石2。0您可以使用關鍵字參數[1] [2]而不是單個哈希參數。
def foo(keyword_arg: 'bar')
keyword_arg
end
這就是它的行爲。
> foo
=> "bar"
> foo(keyword_arg: 'baz')
=> "baz"
這是我要做的事:
def my_method(title, args)
puts title
puts args
傳遞參數:
my_method('test title', a: 'foo', b: 'bar')
# => test title
# => '{:a => 'foo', :b => 'bar'}
U搖滾人!謝謝:) – facundofarias
謝謝,很好地解釋:D +1 –