Structs (अलावा कैसे कोड लग रहा है करने के लिए) को निम्न तरीकों से HashMaps का उपयोग कर से अलग:
- एक struct, विशेषताओं का एक निश्चित सेट है, जबकि आप एक हैश को नई चाबी जोड़ें।
- एक विशेषता को कॉल करना जो किसी स्ट्रक्चर के उदाहरण पर मौजूद नहीं है, कोई हैशूटर त्रुटि का कारण बनता है, जबकि हैश से मौजूद एक मौजूदा कुंजी के लिए मान प्राप्त करने से शून्य हो जाएगी।
- अलग-अलग structs के दो उदाहरण कभी भी समान नहीं होंगे, भले ही structs के समान गुण हों और उदाहरणों के समान मान हों (यानी
Struct.new(:x).new(42) == Struct.new(:x).new(42)
गलत है, जबकि Foo = Struct.new(:x); Foo.new(42)==Foo.new(42)
सत्य है)।
- structs के लिए
to_a
विधि मूल्यों की एक सरणी देता है, जबकि to_a
एक हैश पर आप की-वैल्यू-जोड़े की एक सरणी (जहां "जोड़ी" का अर्थ है "दो तत्व सरणी")
- आप कर सकते हैं
Foo = Struct.new(:x, :y, :z)
हो जाता है Foo.new(1,2,3)
विशेषता नामों का स्पेल किए बिना Foo
का उदाहरण बनाने के लिए।
तो प्रश्न का उत्तर देने के लिए: जब आप गुणों के ज्ञात सेट के साथ ऑब्जेक्ट्स मॉडल करना चाहते हैं, तो structs का उपयोग करें। जब आप अनियंत्रित उपयोग हैशैप्स मॉडल करना चाहते हैं (उदाहरण के लिए गिनती है कि प्रत्येक शब्द स्ट्रिंग या मैपिंग उपनामों में पूर्ण नाम आदि में कितनी बार होता है, निश्चित रूप से किसी संरचना के लिए नौकरियां नहीं होती हैं, जबकि किसी व्यक्ति को नाम, उम्र और पता वाला मॉडल बनाना होगा Person = Struct.new(name, age, address)
के लिए एकदम सही फिट)।
एक sidenote के रूप में: सी structs रूबी structs के साथ कुछ भी करने के लिए कुछ भी नहीं है, तो अपने आप को भ्रमित होने मत देना।
आपका अन्य बिंदुओं सभी सही (ताकि के लिए +1) हैं, लेकिन [ 'Struct # == '] (http://ruby-doc.org/core/classes/Struct.html#M000890) जब आप वास्तव में' Struct.new' के परिणाम को संग्रहीत करते हैं, तो इसे दो बार कॉल करने के विरोध में आपने जो समझाया है उससे भिन्न रूप से काम करता है एक ही तर्क। –
@ मार्ककशकॉफ: अगर मैं 'Foo = Struct.new (: x) करता हूं; बार = स्ट्रक्चर.न्यू (: एक्स) 'और फिर' Foo.new (42) == बार। नया (42) 'मैं झूठा हो जाऊंगा। अगर मैं 'Foo.new (42) == Foo.new (42) करता हूं' मैं सच हो जाऊंगा। और यदि आप ध्यान से पढ़ते हैं, तो वही है जो मैंने कहा (* अलग * structs के दो उदाहरण ")। – sepp2k
मुझे लगता है कि आपका क्या मतलब है। यह मुझे स्पष्ट नहीं था क्योंकि आपने इसे एक स्पष्टीकरण के विपरीत नहीं किया था कि समानता काम करती है एक ही स्ट्रक्चर प्रकार का उपयोग करते समय अपेक्षित। –