ArrayHashのスキーマをチェックする方法です。各要素の型をチェックすることができます。スキーマ自体は、ArrayHashで定義することができます。

既存のArrayクラスとHashクラスにhas_shape?を追加して実現しています。各要素のチェックには、Enumerable#all?を使っています。

# 変数shapeがスキーマです。
shape = { id: Integer, name: String }
p { id: 1, name: "Mike"}.has_shape?(shape)
# => true

p { id: 1, first_name: "Mike"}.has_shape?(shape)
# => false

p { id: 1, name: 00}.has_shape?(shape)
# => false

shape = {
  id: Integer,
  items: { name: String, price: Integer }
}
hash = {
  id: 1,
  items: { name: "ball", price: 1000 }
}
p hash.has_shape?(shape)
# => true

shape = {
  id: [Integer, Integer, Integer]
}
p {id: [1, 2, 3]}.has_shape?(shape)
# => true

参考