Class: Hash
- Inherits:
-
Object
- Object
- Hash
- Defined in:
- lib/obvious/contract.rb
Overview
Instance Method Summary collapse
-
#has_shape?(shape, return_field = false) ⇒ Boolean
Checks if a hash has a certain structure.
- #nil_fields?(list) ⇒ Boolean
Instance Method Details
#has_shape?(shape, return_field = false) ⇒ Boolean
Checks if a hash has a certain structure.
h = { k1: 1, k2: "1" }
h.has_shape?(k1: Integer, k2: String)
#=> true
h.has_shape?(k1: Class, k2: String)
#=> false
It also works with compound data structures.
h = { k1: [], k2: { k3: Struct.new("Foo") } }
shape = { k1: Array, k2: { k3: Module } }
h.has_shape?(shape)
#=> true
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/obvious/contract.rb', line 185 def has_shape?(shape, return_field = false) return_value = lambda { |r, f| if return_field return r, f else return r end } # I added an empty check if self.empty? return return_value.call shape.empty?, nil end self.each do |k, v| return return_value.call false, k if shape[k] == nil end shape.each do |k, v| # hash_value hv = self[k] return return_value.call false, k unless self.has_key? k next if hv === nil if Hash === hv return hv.has_shape?(v, return_field) else return return_value.call false, k unless v === hv end end return_value.call true, nil end |
#nil_fields?(list) ⇒ Boolean
220 221 222 223 224 225 226 |
# File 'lib/obvious/contract.rb', line 220 def nil_fields? list list.each do |field| return true, field unless self[field] end return false, nil end |