Могу ли я передать тип объекта в качестве параметра методу? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующие методы:

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 может быть использован вместе с case конструкция.

1 Ответ

0 голосов
/ 08 марта 2019

Вы можете передать классы:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...