2013-01-20 132 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相關的數據位。一旦你掌握了它,這真是太棒了。 –

相關問題