验证Ruby哈希的形状?
更长,另类的问题是:“有哪些
Ruby库或方法来测试任意数据结构的形状(散列,数组,整数,浮点数,字符串等)?”
首先,让我举一个简单的例子: hash_1 = { k1: 1.0,k2: 42,k3: { k4: "100.00",k5: "dollars" } } 接下来,我想验证它 – 我的意思是比较形状/架构/模板,例如: shape_a = { k1: Float,k2: Integer,k3: Hash } 或者,也许是一个更具体的形状: shape_b = { k1: Float,k3: { k4: String,k5: String } } 一种可能的API可能如下所示: require '_____________' hash_1.schema = shape_a hash_1.valid? # => true hash_1.schema = shape_b hash_1.valid? # => true 这些只是示例,我对其他方法持开放态度. 大约3年前,我写了schema_hash来刮我自己的痒.我打算更新它,但首先我想了解替代方案和更好的方法. 这个问题的动机来自Mongo用例,但问题不一定是Mongo特定的. 就像我在顶部提到的,我希望看到或构建能力验证任意数据结构:哈希,基元等,在任何嵌套组合中. “你不需要Mongo的架构,所以你为什么关心?” >就像我上面提到的,我并不是只考虑Mongo用例 “为什么不写自定义验证呢?” 当我在上一个项目上工作时,这正是我开始的地方.为嵌套哈希重复编写验证会很痛苦.我开始思考什么会让它更容易,我想出了一个类似于我上面分享的语法. 有什么?我该怎么办? 所有这些都说,我很好奇其他人在做什么.有“黄金之路”吗?我正在尝试不同的方法,包括嵌入式文档和与Mongoid相关的validates_ …但是当哈希嵌套超过一个级别或更深时,这些方法看起来有点过分. 我四处寻找Validation on Ruby Toolbox进行验证(双关语),但没找到我要找的东西.当我在那里时,我提出了一个名为“验证”的新类别. 很可能我所要求的内容在“验证”主题领域中更少,而在其他领域则更多,例如“数据结构”和“遍历”.如果是这样,请指出我正确的方向. 解决方法
编辑:重读你的问题,我的回答似乎有点过于简单.我会把它留给你,我应该删除它,只是通过评论让我知道.
一个非常简单的方法是: class Hash def has_shape?(shape) all? { |k,v| shape[k] === v } end end 使用这样: hash_1.has_shape?(shape_a) #=> true shape_b = { k1: Float,k3: Integer } hash_1.has_shape?(shape_b) #=> false 这似乎已经很好地照顾了你的第一个描述版本.将它排除在lib之外并不难,因此它不会对Hash进行修补.添加递归到has_shape?方法将照顾你更精细的案例. 更新:这是一个带递归的版本: class Hash def has_shape?(shape) all? do |k,v| Hash === v ? v.has_shape?(shape[k]) : shape[k] === v end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |