我喜歡「任意屬性的定義」,我認爲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?
操作系統速度很慢,但對原型設計很有幫助。 –