我有以下方法:
YES
在每种方法中,我只检查它是否存在于有效负载中并且是类型。例如:
ensure_properties_string([:type, :owner, payload)
ensure_properties_boolean([:isOn], payload)
ensure_properties_array([:storage], payload)
ensure_properties_hash([:metadata, :tester], payload)
我想避免有太多看起来很相似的方法。有什么想法可以将它们简化为一种方法吗?
也许是代表类型的第三个字符串参数,例如def ensure_properties_string(properties, hash)
properties.each do |property|
unless hash.key?(property.to_s)
raise_error("#{property} is missing")
end
unless property.instance_of? String
raise_error("#{property} not a string")
end
end
可以与array
的构造一起使用。
答案 0 :(得分:0)
您可以通过课程:
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
类。