方法如何在Ruby中使用哈希参数?

时间:2013-05-15 23:11:34

标签: ruby methods hash arguments

我看到一些库方法中使用的哈希参数正如我一直在学习的那样。

如,

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

有人可以解释一个方法如何使用这样的参数,以及如何创建一个使用Hash参数的方法?

5 个答案:

答案 0 :(得分:53)

示例:

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 :(得分:28)

在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}

答案 2 :(得分:11)

当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

答案 3 :(得分: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

答案 4 :(得分:3)

从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/