是否有一个Ruby方法相当于drop_while for hashes?

时间:2016-04-02 05:46:12

标签: ruby-on-rails ruby

我知道对于数组我可以执行以下操作来删除第一个红色并保留第二个红色。是否有哈希的等价物?

colors = ["red", "yellow", "orange", "red", "green", "majenta"]
test = colors.drop_while {|x| x.length < 4}
p test

我从过去的问题中得出的最好的结果如下,但它并不常用。

colors = {
      first: "red",
      second: "yellow",
      third: "green",
      fourth: "red"
}
colors.delete_if{|k,v| v.length < 4 ? true : break }

2 个答案:

答案 0 :(得分:1)

mailcomposer

答案 1 :(得分:0)

实际上,如果您细读了Enumerable文档,您会注意到Enumerable模块包含一个drop_while迭代器。由于Array和Hash类都包含Enumerable模块,因此可以在它们上使用任何Enumerable实例方法。

Hash.new.is_a?(Enumerable)
 => true 
Array.new.is_a?(Enumerable)
 => true 
Enumerable的

drop_while实例方法似乎很简单,但是有一点需要注意。它将删除返回false或nil的元素,直到返回真实值。之后,即使元素返回false或nil,它们也将包含在输出中。如图所示:

[1,2,4,6,1,8].drop_while {|i| i.odd? }  
=> [2, 4, 6, 1, 8]

鉴于上述知识,可以的:

colors = {:first=>"red", :second=>"yellow", :third=>"green", :fourth=>"red"}
colors.drop_while {|_,v| v == "red" }.to_h
 => {:second=>"yellow", :third=>"green", :fourth=>"red"} 

或者您也可以这样做(但是会丢失哈希键):

colors.values.drop_while {|color| color == "red"}
 => ["yellow", "green", "red"] 

最终,由于Hash和Array都包含Enumerable模块,因此您可以在任何一个上使用此实例方法。