29

我喜欢“任意属性的定义”,并且我认为 ruby​​ 中的 OpenStruct 有时感觉比使用哈希更干净,但我很好奇是否还有其他特定优势或用例使 OpenStruct 成为比简单使用更好的选择一个哈希。

4

2 回答 2

38

OpenStruct当您需要一些东西来适应某个方法调用接口时(即发送响应#nameand的鸭子类型对象#value),或者当您想要封装实现细节但又想要避免过度设计解决方案时,对象很有用。它们还制作了一个很棒的存根对象,当我不需要存根/模拟的开销时,我经常使用它们来代替框架存根。

于 2013-01-20T02:50:38.093 回答
26

我认为这主要归结为性能决定。来自Ruby 文档

OpenStruct 利用 Ruby 的方法查找结构来查找和定义属性的必要方法。这是通过方法method_missing 和define_method 完成的。

如果担心所创建对象的性能,这应该是一个考虑因素,因为与使用 Hash 或 Struct 相比,设置这些属性的开销要大得多。

此外,类似 a 的东西Hash在它提供的所有方法中都具有附加功能(has_key?include?等)。从这个角度来看,这OpenStruct是一个非常简单的对象,但是如果您从性能的角度来看没有任何顾虑并且只想要一个简单的对象来使用,OpenStruct那么它是一个不错的选择。

于 2013-01-20T02:48:32.937 回答