Ruby on Rails:更简单的 Hash.slice 方法?

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?

mu *_*ort 7

哈希可以有各种各样的键,键不必只是字符串或符号。例如,这是一个完全有效的哈希:

{ [ :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)

您可能不想只压平一个级别(或者您可能不想)。