2011-12-30 18 views
103

:key => "value" (हैशरकेट) और key: "value" (रूबी 1.9) नोटेशन के बीच कोई अंतर है?क्या `: key =>" value "` और `key:" value "` हैश नोटेशन के बीच कोई अंतर है?

यदि नहीं, तो मैं key: "value" नोटेशन का उपयोग करना चाहता हूं। क्या कोई मणि है जो मुझे :x => से x: नोटेशन में कनवर्ट करने में मदद करता है?

उत्तर

136

हां, एक अंतर है। ये कानूनी हैं:

h = { :$in => array } 
h = { :'a.b' => 'c' } 
h[:s] = 42 

लेकिन इन नहीं हैं:

h = { $in: array } 
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+ 
h[s:] = 42 

तुम भी => के साथ एक कुंजी के रूप में कुछ भी उपयोग कर सकते हैं ताकि आप यह कर सकते हैं:

h = { C.new => 11 } 
h = { 23 => 'pancakes house?' } 

लेकिन आप कर सकते हैं ' टी ऐसा करें:

h = { C.new: 11 } 
h = { 23: 'pancakes house?' } 

जावास्क्रिप्ट शैली (key: value) केवल तभी उपयोगी है जब आपकी सभी हैश कुंजी "सरल" प्रतीक हैं (/\A[a-z_]\w*\z/i से मेल खाने वाली अधिक या कम, AFAIK पार्सर इन चाबियों के लिए अपने लेबल पैटर्न का उपयोग करता है)।

:$in शैली प्रतीक मोंगोडीबी का उपयोग करते समय एक उचित बिट दिखाते हैं ताकि आप मोंगोडीबी का उपयोग करते हुए हैश शैलियों को मिलाकर समाप्त कर सकें। और, यदि आप कभी भी पूरे हैंश (h = { ... }) की बजाय हैश (h[:k]) की विशिष्ट कुंजी के साथ काम करते हैं, तो आपको अभी भी प्रतीकों के लिए कॉलन-प्रथम शैली का उपयोग करना होगा; आपको हैश के बाहर उपयोग किए जाने वाले प्रतीकों के लिए अग्रणी कॉलन शैली का भी उपयोग करना होगा। मैं लगातार होना पसंद करता हूं इसलिए मुझे जावास्क्रिप्ट शैली से परेशान नहीं है।

जावास्क्रिप्ट शैली के साथ कुछ समस्याएं रूबी 2.2 में तय की गई हैं। अब आप उदाहरण के लिए, उद्धरण चिह्नों का उपयोग कर सकते हैं अगर आपको लगता है कि वैध लेबल नहीं हैं प्रतीक हैं:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } } 

लेकिन आप अभी भी hashrocket की जरूरत है अपनी चाबी प्रतीक नहीं हैं।

+0

'h = {'a.b': 'c'}' अब रूबी 2.2.0 के रूप में कानूनी है। Https://bugs.ruby-lang.org/issues/4276 –

+0

@BSeven देखें: धन्यवाद, मैंने [मेरे अन्य बड़े हैशकेट उत्तर] को अपडेट किया है (http://stackoverflow.com/a/10004344/479863) थोड़ी देर पहले लेकिन चूक गया यह वाला। –

+0

आपको लगता है कि 'एच [: एस] = 42' उदाहरण इस सवाल से संबंधित क्यों है? मेरी राय में, जावास्क्रिप्ट शैली बनाम हैशरेट शैली केवल हैश कुंजी/मूल्य जोड़ी परिभाषा के लिए प्रासंगिक है, और कुंजी द्वारा हैश तत्वों को संबोधित नहीं करना है। इसलिए 'एच [एस:] = 42' उदाहरण भ्रामक प्रतीत होता है। –

4

key: value JSON-style असाइनमेंट नए रूबी 1.9 हैश सिंटैक्स का हिस्सा हैं, इसलिए ध्यान रखें कि यह वाक्यविन्यास रूबी के पुराने संस्करणों के साथ काम नहीं करेगा। इसके अलावा, चाबियाँ प्रतीक होने जा रहे हैं। यदि आप उन दो बाधाओं के साथ रह सकते हैं, तो नए हैंश पुराने पुराने हैंश की तरह काम करते हैं; उन्हें बदलने के लिए कोई कारण नहीं है (शैली के अलावा, शायद)।

+4

पुनश्च: यह * नहीं है * JSON शैली, यह जावास्क्रिप्ट शैली है। JSON को उद्धृत करने के लिए कुंजी की आवश्यकता होती है। –

10

key: "value" रूबी 1.9 की सुविधा सुविधा है; जब तक आप जानते हैं कि आपका पर्यावरण इसका समर्थन करेगा, मुझे इसका उपयोग करने का कोई कारण नहीं दिखता है। एक रॉकेट की तुलना में एक कोलन टाइप करना बहुत आसान है, और मुझे लगता है कि यह बहुत साफ दिखता है। रूपांतरण के लिए एक मणि होने के नाते, शायद नहीं, लेकिन यह आपके लिए एक आदर्श सीखने का अनुभव जैसा लगता है, अगर आप पहले से ही फ़ाइल हेरफेर और नियमित अभिव्यक्तियों को नहीं जानते हैं।

1

:key => valuekey: value करने जैसा ही है, और वास्तव में केवल एक सुविधा है। मैंने => का उपयोग करने वाली अन्य भाषाओं को नहीं देखा है, लेकिन जावास्क्रिप्ट जैसे अन्य लोग अपने हैश-समकक्ष डेटाटाइप में key: value का उपयोग करते हैं।

आपके मशरूम को लिखने के तरीके को बदलने के लिए एक मणि के रूप में, मैं बस अपने वर्तमान प्रोजेक्ट के लिए इसे करने के तरीके से चिपके रहूंगा।

* ध्यान दें कि key: value का उपयोग करने में कुंजी एक प्रतीक होगी, और foo हैश में उस कुंजी पर संग्रहीत मूल्य तक पहुंचने के लिए अभी भी foo[:key] होगा।

+0

पर्ल और PHP दोनों '=> 'का उपयोग करते हैं। मुझे लगता है कि रूबी, पर्ल द्वारा अत्यधिक प्रेरित होने के कारण, पर्ल से वाक्यविन्यास उधार लिया :) –

2

रूबी हैश कुंजी हैश रॉकेट द्वारा आवंटित कुंजी-मान जोड़ों के लिए तार (, उदा,'s' => x) प्रतीकों (जैसेkey: "value" या :key => "value") तार के साथ नहीं सौंपा जा सकता है के माध्यम से मदद कर सकते हैं कुंजी असाइनमेंट जबकि। हालांकि हैश-रॉकेट हैश-टेबल के लिए स्वतंत्रता और कार्यक्षमता प्रदान करते हैं, विशेष रूप से तारों को के रूप में तारों की इजाजत देता है, हैश-टेबल के रूप में हैश-टेबल का निर्माण किया गया था, तो एप्लिकेशन प्रदर्शन धीमा हो सकता है। निम्न संसाधनों hashrockets और प्रतीकों के बीच कोई अंतर स्पष्ट करने के लिए सक्षम हो सकता है:

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^