我在我们的一个旧存储库中找到了非常罕见的(对我而言)代码行。以下代码是PoC应用程序的一部分,用于简单的Note take app。尽管如此,模型文件夹中的这两行让我感到惊讶:
class Note < Struct.new(:title, :due_to, :body, :self_url, :image_url)
end
我正在寻找这种技术一段时间,并没有真正找到关于这个实现的一些有价值的信息来源。
有人可以帮助我更好地理解这一点吗?我认为Struct的这种用法只是创建继承自Struct的新对象。但我不认为这有什么好处。
答案 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类型,结构非常好。