8

Struct使用与定义方法的优缺点是initialize什么?

我已经可以看到它涉及的代码更少,并且在缺少参数时不会引发:

使用结构:

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经常在项目中使用?

4

1 回答 1

14

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

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

与结构版本相比:

>> 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 作为一次性数据对象。我在我的域和应用程序中使用“真实”类。

于 2013-07-05T15:40:14.140 回答