cqc*_*991 1 ruby hash ruby-on-rails
在http://api.rubyonrails.org/classes/Hash.html#method-i-slice 中,我看到
valid_keys = [:mass, :velocity, :time]
search(options.slice(*valid_keys))
Run Code Online (Sandbox Code Playgroud)
我不明白这里的用法。我的意思是,如果我传入一个arrayinto slice,我肯定希望每个都key被切片,那为什么要*在这里使用附加项呢?
是否可以将其变成类似的东西:
valid_keys = [:mass, :velocity, :time]
search(options.simple_slice(valid_keys))
Run Code Online (Sandbox Code Playgroud)
通过创建更简单的slice?
哈希可以有各种各样的键,键不必只是字符串或符号。例如,这是一个完全有效的哈希:
{ [ :mass, :velocity, :time ] => 'pancakes' }
Run Code Online (Sandbox Code Playgroud)
怎么Hash#slice应该知道有时候这个:
h.slice([:mass, :velocity, :time])
Run Code Online (Sandbox Code Playgroud)
意思是“给我这三个键的子哈希”,有时它的意思是“给我那个数组作为键的子哈希”?
Hash#slice 接受一个键列表(每个参数一个键),所以如果你想把你的键放在一个数组中,那么你必须把它们放到单独的参数中:
h.slice(*some_array_of_keys)
# ------^ expand the array into individual arguments
Run Code Online (Sandbox Code Playgroud)
这就是为什么你需要*.
如果你想假设键永远不会是数组,那么你可以自由地说:
def simple_slice(*keys) # Allow any number of arguments
slice(*keys.flatten) # flatten all the arrays and then punt to Rails's slice.
end
Run Code Online (Sandbox Code Playgroud)
您可能不想只压平一个级别(或者您可能不想)。