Sen*_*jai 34 ruby methods hash arguments
我看到一些库方法中使用的哈希参数,正如我一直在学习的那样.
例如,
list.search(:titles, genre: 'jazz', duration_less_than: 270)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一个方法如何使用这样的参数,以及如何创建一个使用哈希参数的方法?
Ida*_*rye 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)
Run Code Online (Sandbox Code Playgroud)
我hash={}用来指定最后一个参数是一个哈希值,默认值为空哈希值.现在,当我写:
foo("regular argument", a: 12, :b => 13)
Run Code Online (Sandbox Code Playgroud)
它实际上是一个语法糖:
foo("regular argument", {a: 12, :b => 13})
Run Code Online (Sandbox Code Playgroud)
此外,{a: 12}是语法糖{:a => 12}.
当所有这些组合在一起时,您将获得与其他语言中的命名参数类似的语法.
Bor*_*cky 29
在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}
Run Code Online (Sandbox Code Playgroud)
Bre*_*don 11
当Ruby方法调用的参数列表以一个或多个键值对结束时,如foo: 'bar'或'foo' => 1,Ruby将它们全部收集到一个哈希中,并将该哈希作为最后一个参数传递.你可以看到自己irb:
irb(main):002:0> puts foo: 'bar', baz: 'quux'
{:foo=>"bar", :baz=>"quux"}
=> nil
Run Code Online (Sandbox Code Playgroud)
因此,您可以向正在编写的方法添加最终的可选参数以接收此哈希.您通常希望将其默认为空哈希.您可以根据需要调用参数,但这options是一个通用名称:
def my_method(a, b, c, options = {})
...
end
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Rails,这是一个有用的技巧:将普通字符串和符号视为等效字符通常很方便.Rails添加了一种symbolize_keys!方法来Hash将所有字符串键转换为符号:
def my_method(a, b, c, options = {})
options.symbolize_keys!
...
end
Run Code Online (Sandbox Code Playgroud)