如果定义了所有属性,则创建ruby对象

时间:2014-09-02 18:58:40

标签: ruby

我有一个哈希定义了一些变量:

        event_details = {
            :title => title(event),
            :desc => desc(event),
            :url => url(event),
            :datetime => datetime(event),
            :address => address,
            :lat => coords["lat"],
            :lng => coords["lng"]
        }

我想创建一个"事件"对象

event = Event.new(event_details)

现在我只想创建对象event当且仅当所有属性都被定义而不是nil时,例如,lat和lng变量有时为nil,我不想创建该事件宾语。

我正在考虑在我的事件类中使用rescue子句,但我不确定如何创建事件实例,并验证每个属性的存在。任何提示将不胜感激

2 个答案:

答案 0 :(得分:1)

我建议:

keys = [:title, :desc, :url, :datetime, :address, :lat, :lng]

event = Event.new(event_details) unless
        (keys-event_details.keys].any? || event_details.values.any?(&:nil?)

if (keys-event_details.keys].any? || event_details.values.any?(&:nil?)
  <..action..>
else
  event = Event.new(event_details)
end

答案 1 :(得分:0)

你可以这样做:

class Event
  attr_accessor :title, :desc

  RequiredKeys = [:title, :desc]

  def initialize(hash = {})
    missing_keys = RequiredKeys - hash.keys
    raise "Required keys missing:  #{missing_keys.join(', ')}" unless missing_keys.empty?
    hash.each do |key, value|
      public_send("#{key}=", value);
    end
  end
end