我可以将对象的类型作为参数传递给方法吗?

时间:2019-03-08 07:15:05

标签: ruby

我有以下方法:

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的构造一起使用。

1 个答案:

答案 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类。