【问题标题】:When should I use an OpenStruct instead of a Hash?什么时候应该使用 OpenStruct 而不是 Hash?
【发布时间】:2013-01-20 02:46:15
【问题描述】:

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

【问题讨论】:

  • 操作系统速度较慢,但​​非常适合原型设计。

标签: ruby ruby-1.9.3 openstruct


【解决方案1】:

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

【讨论】:

  • +1 用于提及它们在测试中的用途。在测试 API/Web 服务调用时,我广泛使用它们来存根与 HTTP 相关的数据位。一旦掌握了窍门,就非常棒了。
【解决方案2】:

我认为这主要取决于性能决定。来自Ruby Documentation

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

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

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

【讨论】:

  • 进一步注意,在 Ruby 1.9.3 中(至少)所有工作都是在创建 OpenStruct 时完成的,而不是在第一次使用方法时完成。即使您从不访问任何成员函数,这也会使 OpenStruct 变得昂贵。 (不知道以后版本有没有修复)。
猜你喜欢
  • 2010-11-13
  • 2019-06-15
  • 2011-06-22
  • 2015-12-11
  • 2012-02-12
  • 2012-06-27
  • 2010-11-29
  • 2015-12-23
相关资源
最近更新 更多