2013-07-05 59 views
8

与定义initialize方法相比,使用Struct有什么优缺点?Ruby:结构与初始化

我已经可以看到,它涉及缺少变量时更少的代码不涨价

使用结构:

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

你的用例是什么? Struct'对于那些没有太多附加逻辑的事物来说是很棒的。 – tadman

+0

当你需要使用初始化函数定义类的时候,我只是想要你的想法。由于使用'Struct'似乎是“更性感”,所以我想知道下拉菜单,如果有的话。 –

+0

如果你有一个特定的用例,那是一个关于主题的问题。如果你只是想讨论一下各种实现的优缺点,那不适合问答格式。 –

回答

14

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

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

相比于结构的版本:

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

因此,结构类可能被误认为是一个数组(但绝对可能发生)

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

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

+0

有趣!你绝对不希望将它们当作'Class'使用,如果它们不像那样表现的话。谢谢。我会看看其他人不得不说的,并接受相应的答案:) –

+9

我认为这里的正确思路是对简单数据容器使用'Struct',作为传递Hashes的替代方法,并使用适当的Object当你真的添加任何类型的逻辑。 – tadman