我正在寻找一个更好的方式做检查哈希的键包括所有的一组键的
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