我正在尋找一個更好的方式做檢查哈希的鍵包括所有的一組鍵的
if hash.key? :a &&
hash.key? :b &&
hash.key? :c &&
hash.key? :d
最好類似
hash.includes_keys? [ :a, :b, :c, :d ]
我想出了
hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d]
但我不喜歡不得不添加陣列兩次,雖然
我正在尋找一個更好的方式做檢查哈希的鍵包括所有的一組鍵的
if hash.key? :a &&
hash.key? :b &&
hash.key? :c &&
hash.key? :d
最好類似
hash.includes_keys? [ :a, :b, :c, :d ]
我想出了
hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d]
但我不喜歡不得不添加陣列兩次,雖然
[:a, :b, :c, :d].all? {|s| hash.key? s}
如果你想使它更復雜,你可以使用'[:a,:b,:c,:d] .all?(&hash.method(:鑰匙?))'。 – 2016-08-23 21:11:13
@森的方式是最好的,但這裏的另一種方式:
([:a, :b, :c, :d] - hash.keys).empty?
或
hash.slice(:a, :b, :c, :d).size == 4
就在TIMTOWTDI的精神,這裏是另一種方式。如果您require 'set'
(在標準庫),那麼你可以這樣做:
Set[:a,:b,:c,:d].subset? hash.keys.to_set
我喜歡這樣的方式來解決這個問題:
subset = [:a, :b, :c, :d]
subset & hash.keys == subset
它是快速和清晰。
工作除非需要嚴格匹配。 [:a,:b,:c,:d]&[:a,:b,:c,:d,:e] – 2015-05-21 22:49:42
然而,問題不在於此。 – 2015-05-23 08:51:49
你可以得到丟失的鑰匙的名單是這樣的:
expected_keys = [:a, :b, :c, :d]
missing_keys = expected_keys - hash.keys
如果你只是想看看是否有任何丟失的鑰匙:
(expected_keys - hash.keys).empty?
真棒這裏的答案不使用任何循環:http://stackoverflow.com/a/4743729/238880 – 2013-06-27 15:08:19