何时应该使用OpenStruct而不是Hash?

32

我喜欢“任意属性定义”的概念,并认为在ruby中使用OpenStruct有时比使用哈希更加简洁,但我很好奇是否还有其他特定的优势或用例,使OpenStruct比仅使用哈希更好。


操作系统速度较慢,但非常适合原型设计。 - Dave Newton
2个回答

41

OpenStruct 对象在需要符合特定方法调用接口(即发送一个响应 #name#value 的鸭子类型对象)或者想要封装实现细节,但又不想过度设计解决方案时非常有用。 它们也是非常好的存根对象,在我不需要存根/模拟的开销时,我经常使用它们来代替框架存根。


16
提到了在测试中使用它们的加分。当我测试API/ Web服务调用时,我广泛使用它们来存根与HTTP相关的数据位。一旦掌握了技巧,就相当棒。 - Kyle Carlson

27

我认为这主要是出于性能考虑。来自Ruby文档

OpenStruct利用了Ruby的方法查找结构来查找和定义属性所需的方法。这是通过使用method_missing和define_method方法实现的。

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

另外,像Hash这样的东西具有所有提供的方法(has_key?include?等)。从这个角度来看,OpenStruct是一个非常简单的对象,但如果您没有性能方面的顾虑,只想要一个易于使用的对象,那么使用OpenStruct是一个不错的选择。


作为进一步的警告,在Ruby 1.9.3(至少)中,所有工作都在创建OpenStruct时完成,而不是在第一次方法使用时。这使得OpenStruct变得昂贵,即使您从未访问任何成员函数。(不知道这个问题是否在后续版本中修复)。 - MZB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接