Ruby:Struct vs Initialize

时间:2013-07-05 15:29:37

标签: ruby-on-rails ruby ruby-on-rails-3

使用Struct与定义initialize方法相比有哪些优缺点?

我在错过参数时已经看到它涉及更少的代码没有提升

使用struct:

class Fruit < Struct.new(:name)
end

> Fruit.new.name
 => nil
> Fruit.new('apple').name
 => "apple"

使用初始化:

class Fruit
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

> Fruit.new.name
ArgumentError: wrong number of arguments (0 for 1)
> Fruit.new('apple').name
 => "apple"

你有什么想法?您是否经常在项目中使用Struct

1 个答案:

答案 0 :(得分:14)

类(非结构)具有更简单的祖先树:

>> Fruit.ancestors
=> [Fruit, Object, Kernel, BasicObject]

与struct version相比:

>> Fruit.ancestors
=> [Fruit, #<Class:0x1101c9038>, Struct, Enumerable, Object, Kernel, BasicObject]

因此,Struct类可能被误认为是一个数组(很少见,但绝对可能发生)

fruit = Fruit.new("yo")
# .. later
fruit.each do |k|
  puts k
end
# outputs: yo

所以......我使用Structs作为丢弃数据对象。我使用&#34;真实&#34;我的域和应用程序中的类。