我想创建一个可以用两种不同方式初始化的对象。我找到了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
提前致谢!
答案 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