如何快速判断Hash的所有键为Symbol或String类型
快速检查Hash所有键是否全为Symbol或全为String的实现方法
Ruby没有提供专门的内置方法直接做这个判断,但用原生枚举方法可以写出非常简洁高效的实现,完全满足日常开发需求:
- 检查所有键是否全为Symbol类型
hash.keys.all?(Symbol)
- 检查所有键是否全为String类型
hash.keys.all?(String)
- 检查是否满足「要么全是Symbol键、要么全是String键」的二选一条件
hash.keys.all?(Symbol) || hash.keys.all?(String)
注意:上面的写法对空Hash会返回
true,因为Ruby的all?方法对空枚举集合默认返回真值。如果你的业务逻辑里空Hash不属于符合要求的场景,加上非空判断即可:
# 空Hash判定为不符合要求的写法 !hash.empty? && (hash.keys.all?(Symbol) || hash.keys.all?(String))
如果项目里需要频繁做这个判断,可以直接给Hash类挂载便捷实例方法,放到全局工具配置里就能全局调用:
class Hash # 判断所有键是否全为Symbol def all_symbol_keys? keys.all?(Symbol) end # 判断所有键是否全为String def all_string_keys? keys.all?(String) end # 判断是否满足全Symbol/全String键的二选一条件(空Hash返回false) def valid_symbol_or_string_keys? !empty? && (all_symbol_keys? || all_string_keys?) end end
这类写法的性能足够好,all?本身做了短路优化,遍历键集合时只要遇到第一个不符合类型要求的键就会立刻终止遍历返回false,不会产生多余的性能开销,哪怕是键量级很大的Hash也可以放心用。
内容的提问来源于stack exchange,提问作者user2939055
相关产品推荐
相关产品推荐

