我喜欢“任意属性的定义”,我认为ruby中的OpenStruct有时会感觉比使用散列更清晰,但我很好奇是否还有其他特定的优点或使OpenStruct成为更好的选择的用例只需使用哈希。什么时候应该使用OpenStruct而不是哈希?
回答
我认为这主要归结为性能决定。来自Ruby Documentation:
OpenStruct利用Ruby的方法查找结构来查找和定义属性的必要方法。这是通过method_missing和define_method方法完成的。
如果对创建的对象的性能有所顾虑,应该考虑这一点,因为与使用散列或结构相比,设置这些属性的开销要多得多。
此外,像一个Hash
具有与所有的它提供的方法(has_key?
,include?
等)的附加功能。从这个角度来看,OpenStruct
是一个非常简单的对象,但如果您从性能角度来看没有任何问题,并且只是想要一个简单的对象,OpenStruct
是一个不错的选择。当你需要的东西,以适应特定的方法调用接口(即发送的鸭类型的对象响应#name
和#value
),或当你想封装的实施细则,同时也希望避免
作为进一步的警告,在Ruby 1.9.3(至少)中,所有的工作都是在OpenStruct被创建时完成的,而不是在第一次使用方法时完成的。这使得OpenStruct价格昂贵,即使你从不访问任何成员函数。 (不知道这是否已在更高版本中修复)。 – MZB
OpenStruct
对象是有用的过度设计解决方案。他们也创建了一个很棒的存根对象,当我不需要存根/模拟的开销时,我经常使用它们来代替框架存根。
+1提及它们在测试中的用途。在测试API/Web服务调用时,我广泛使用它们来存储与HTTP相关的数据位。一旦你掌握了它,这真是太棒了。 –
- 1. 什么时候应该使用AWS,什么时候不使用
- 2. 什么时候应该使用async/await,什么时候不用?
- 3. 什么时候应该使用INNER-LOOP-JOIN而不是INNER JOIN
- 4. 什么时候应该使用susy-media而不是susy-breakpoint
- 5. 什么时候应该使用double而不是小数?
- 6. 什么时候应该使用UIImagePickerControllerSourceTypePhotoLibrary而不是UIImagePickerControllerSourceTypeSavedPhotosAlbum?
- 7. Python:什么时候应该使用subprocess.Popen而不是os.popen?
- 8. 什么时候应该使用ThreadLocal而不是Thread.SetData/Thread.GetData?
- 9. Python:什么时候应该使用子类而不是方法?
- 10. 什么时候应该使用fputs而不是fprintf?
- 11. 什么时候应该使用字符串而不是stringstream?
- 12. 什么时候应该使用宏而不是内联函数?
- 13. 什么时候应该使用的NSKeyedArchiver,而不是SQLite的?
- 14. 什么时候应该使用angular.component而不是angular.directive?
- 15. Swift:我应该什么时候使用“var”而不是“let”?
- 16. 什么时候应该使用Task.Run()而不是等待?
- 17. 什么时候应该使用Map而不是For循环?
- 18. 什么时候应该使用UserControl而不是Page?
- 19. 什么时候应该使用组件而不是指令?
- 20. 什么时候应该使用ReBuild而不是Build?
- 21. 什么时候应该使用reg而不是电线?
- 22. 什么时候应该使用#ifdef而不是if()?
- 23. 什么时候应该使用IBOutlet而不是IBAction?
- 24. 什么时候应该使用Regex而不是String.IndexOf()?或String.Contains()?
- 25. 什么时候应该使用HStoreField而不是JSONField?
- 26. 什么时候应该使用会话变量而不是cookie?
- 27. 什么是phtml,什么时候应该使用.phtml扩展名而不是.php?
- 28. 什么时候应该使用sed,什么时候应该使用awk
- 29. 什么时候应该使用memcpy,什么时候应该使用memmove?
- 30. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
操作系统速度很慢,但对原型设计很有帮助。 –