Вы можете передать классы:
def ensure_properties_of_type(type, properties, hash)
properties.each do |property|
raise_error("#{property} is missing") unless hash.key?(property.to_s)
raise_error("#{property} not a string") unless hash[property.to_s].instance_of? type
end
end
ensure_properties_of_type(String, [:type, :owner], payload)
ensure_properties_of_type(Array, [:storage], payload)
ensure_properties_of_type(Hash, [:metadata, :tester], payload)
Или вы можете определить методы динамически:
[String, Array, Hash].each do |type|
define_method("ensure_properties_#{type.name.downcase}") do |properties, hash|
properties.each do |property|
raise_error("#{property} is missing") unless hash.key?(property.to_s)
raise_error("#{property} not a string") unless hash[property.to_s].instance_of? type
end
end
end
ensure_properties_string([:type, :owner], payload)
ensure_properties_array([:storage], payload)
ensure_properties_hash([:metadata, :tester], payload)
Обратите внимание, что в Ruby нет класса Boolean
.