Ruby类初始化

时间:2016-03-23 11:26:33

标签: ruby constructor

我想创建一个可以用两种不同方式初始化的对象。我找到了3种不同的方法来完成同样的事情,我想知道哪种方法是最好的,如果还有另一种更好的方法。

方法

attr_accessor :id, :status, :dateTime
  def initialize *args
    if args.length == 1
      puts args[0]
    @id = args[0]['id']
    @status = args[0]['status']
    @dateTime = args[0]['dateTime']
    else
      @id = args[0]
      @status = args[1]
      @dateTime = args[2]
    end
  end

方法2 :(注意我需要手动设置参数作为第二种方式)

  attr_accessor :id, :status, :dateTime
  def initialize hash = nil
    if hash != nil
    @id = hash['id']
      @status = hash['status']
      @dateTime = hash['dateTime']
    end
  end

方法3 :(请注意,我需要手动设置参数作为第二种方式,并且它与我的第二种方式几乎相同,只是不在构造函数中)

attr_accessor :id, :status, :dateTime
  def initialize
  end

  def self.create hash
    if hash != nil
      obj = Obj3.new
      obj.id = hash['id']
      obj.status = hash['status']
      obj.dateTime = hash['dateTime']
      return obj
    end
  end

提前致谢!

1 个答案:

答案 0 :(得分:4)

我会尝试使用哈希作为构造函数,例如下面的代码改编自DRY Ruby Initialization with Hash Argument

class Example
  attr_accessor :id, :status, :dateTime

  def initialize args
    args.each do |k,v|
      instance_variable_set("@#{k}", v) unless v.nil?
    end
  end
end

这样,在构造函数中设置每个属性变为可选。因为instance_variable_set方法将设置每个属性,如果has包含它的值。

这意味着您可以支持任意数量的构建对象的方法。唯一的缺点是你可能需要在你的代码中做更多的nil检查,但是没有更多的信息,很难知道。

创建新对象 - 用法示例

要使用此技术创建新对象,您只需将哈希值传递给初始化程序:

my_new_example = Example.new :id => 1, :status => 'live'
#=> #<Example: @id=1, @status='live'>

它足够灵活,可以使用一个构造函数创建多个没有特定属性的对象:

my_second_new_example = Example.new :id => 1
#=> #<Example: @id=1>

my_third_new_example = Example.new :status => 'nonlive', :dateTime => DateTime.new(2001,2,3)
#=> #<Example: @id=1, @dateTime=2001-02-03T00:00:00+00:00>

创建对象后,您仍然可以更新属性:

my_new_example.id = 24