2013-01-20 64 views
20

我喜欢“任意属性的定义”,我认为ruby中的OpenStruct有时会感觉比使用散列更清晰,但我很好奇是否还有其他特定的优点或使OpenStruct成为更好的选择的用例只需使用哈希。什么时候应该使用OpenStruct而不是哈希?

+0

操作系统速度很慢,但对原型设计很有帮助。 –

回答

18

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

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

如果对创建的对象的性能有所顾虑,应该考虑这一点,因为与使用散列或结构相比,设置这些属性的开销要多得多。

此外,像一个Hash具有与所有的它提供的方法(has_key?include?等)的附加功能。从这个角度来看,OpenStruct是一个非常简单的对象,但如果您从性能角度来看没有任何问题,并且只是想要一个简单的对象,OpenStruct是一个不错的选择。当你需要的东西,以适应特定的方法调用接口(即发送的鸭类型的对象响应#name#value),或当你想封装的实施细则,同时也希望避免

+0

作为进一步的警告,在Ruby 1.9.3(至少)中,所有的工作都是在OpenStruct被创建时完成的,而不是在第一次使用方法时完成的。这使得OpenStruct价格昂贵,即使你从不访问任何成员函数。 (不知道这是否已在更高版本中修复)。 – MZB

25

OpenStruct对象是有用的过度设计解决方案。他们也创建了一个很棒的存根对象,当我不需要存根/模拟的开销时,我经常使用它们来代替框架存根。

+10

+1提及它们在测试中的用途。在测试API/Web服务调用时,我广泛使用它们来存储与HTTP相关的数据位。一旦你掌握了它,这真是太棒了。 –

相关问题