在类定义中使用Struct

时间:2014-04-14 23:21:06

标签: ruby oop struct dry

我在我们的一个旧存储库中找到了非常罕见的(对我而言)代码行。以下代码是PoC应用程序的一部分,用于简单的Note take app。尽管如此,模型文件夹中的这两行让我感到惊讶:

class Note < Struct.new(:title, :due_to, :body, :self_url, :image_url) 
end

我正在寻找这种技术一段时间,并没有真正找到关于这个实现的一些有价值的信息来源。

有人可以帮助我更好地理解这一点吗?我认为Struct的这种用法只是创建继承自Struct的新对象。但我不认为这有什么好处。

2 个答案:

答案 0 :(得分:1)

Struct.new(:title, :due_to, :body, :self_url, :image_url)
#=> #<Class:0x007fed5b1859c0>

检查出来,Struct.new返回类。可以为某些命名字段创建带有getter和setter的实例的类。当然,任何类都可以继承自。

所以这只是在类声明中定义实例属性列表的一种奇怪的方式。

这意味着它在功能上与:

相同
class Note
  attr_accessor :title, :due_to, :body, :self_url, :image_url
end

答案 1 :(得分:0)

这行代码是声明基于Struct的类的特殊方式。更常见的做法是(根据我的经验):

Note = Struct.new(:title, :due_to, :body, :self_url, :image_url) do
  …
end

Struct类为其命名属性获取自动访问器和初始化方法,以及包含[][]=的类似哈希的接口,用于获取和设置命名属性{{1}对于属性和一些其他好东西。对于POD-ish类型,结构非常好。