加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

验证Ruby哈希的形状?

发布时间:2020-12-17 03:38:34 所属栏目:百科 来源:网络整理
导读:更长,另类的问题是:“有哪些 Ruby库或方法来测试任意数据结构的形状(散列,数组,整数,浮点数,字符串等)?” 首先,让我举一个简单的例子: hash_1 = { k1: 1.0,k2: 42,k3: { k4: "100.00",k5: "dollars" }} 接下来,我想验证它 – 我的意思是比较形状/架构/模
更长,另类的问题是:“有哪些 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用例
>但即使在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读