我看到一些库方法作为我一直在学习哈希参数。
例如,
list.search(:titles, genre: 'jazz', duration_less_than: 270)
有人能解释的方法是如何使用的参数是这样,怎么可以创建一个利用了哈希参数的方法?
我看到一些库方法作为我一直在学习哈希参数。
例如,
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中,你可以使用**
哈希图示:
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
,红宝石组织在一起成为一个单一的散列并将该散列作为最后一个参数。 你可以看到自己在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
由于红宝石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'}