簡體   English   中英

方法如何在Ruby中使用哈希參數?

[英]How do methods use hash arguments in 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}語法糖。

將所有這些組合在一起后,您將獲得一種語法,該語法看起來與其他語言中的命名參數相似。

在Ruby 2.x中,您可以使用** hash splat:

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}

當Ruby方法調用的參數列表以一個或多個鍵值對結尾(例如foo: 'bar''foo' => 1 ,Ruby會將它們全部收集到單個哈希中,並將該哈希作為最后一個參數傳遞。 您可以在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

我會選擇以下兩種方法之一:

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

從Ruby 2.0開始,您可以使用關鍵字參數[1] [2]來代替單個Hash參數。

def foo(keyword_arg: 'bar')
  keyword_arg
end

這是它的行為方式。

> foo
=> "bar"
> foo(keyword_arg: 'baz')
=> "baz"
  1. http://robots.thoughtbot.com/ruby-2-keyword-arguments
  2. http://brainspec.com/blog/2012/10/08/keyword-arguments-ruby-2-0/

這是我的方法:

def my_method(title, args)
  puts title
  puts args

傳遞參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM