Ruby:Struct vs Initialize

Pie*_*ois 8 ruby ruby-on-rails ruby-on-rails-3

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

我已经可以看到它涉及更少的代码不是在错过参数时提高:

使用struct:

class Fruit < Struct.new(:name)
end

> Fruit.new.name
 => nil
> Fruit.new('apple').name
 => "apple"
Run Code Online (Sandbox Code Playgroud)

使用初始化:

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"
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*ott 14

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

>> Fruit.ancestors
=> [Fruit, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

与struct版本相比:

>> Fruit.ancestors
=> [Fruit, #<Class:0x1101c9038>, Struct, Enumerable, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

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

fruit = Fruit.new("yo")
# .. later
fruit.each do |k|
  puts k
end
# outputs: yo
Run Code Online (Sandbox Code Playgroud)

所以...我使用Structs作为丢弃数据对象.我在我的域和应用程序中使用"真正的"类.

  • 我认为这里正确的想法是你使用`Struct`作为简单的数据容器,作为传递Hashes的替代方法,并在你实际添加任何类型的逻辑时使用适当的Object. (9认同)