क्या `: कुंजी =>" मान "और` कुंजी: "मान" हैश संकेतन के बीच कोई अंतर है?


124

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

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

जवाबों:


153

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

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जब MongoDB का उपयोग कर ताकि आप हैश शैलियों मिश्रण अगर आप MongoDB का उपयोग पहुंच जाएंगे शैली प्रतीकों एक निष्पक्ष बिट दिखाई देते हैं। और, यदि आप कभी-कभी h[:k]केवल पूरे हैश ( ) के बजाय हैश ( ) की विशिष्ट कुंजी के साथ काम करते हैं h = { ... }, तो आपको अभी भी प्रतीकों के लिए कोलोन-प्रथम शैली का उपयोग करना होगा; आपको उन प्रतीकों के लिए अग्रणी-बृहदान्त्र शैली का उपयोग करना होगा जो आप हैश के बाहर उपयोग करते हैं। मैं लगातार रहना पसंद करता हूं इसलिए मैं जावास्क्रिप्ट शैली से बिल्कुल भी परेशान नहीं हूं।

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

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

लेकिन आपको अभी भी हैशट्रॉक की जरूरत है अगर आपकी चाबियां प्रतीक नहीं हैं।


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

@BSeven: थैंक्स, मैंने कुछ समय पहले अपने दूसरे बड़े हैशट्रॉक उत्तर को अपडेट किया था लेकिन यह याद आ गया।
म्यू बहुत कम है

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

@NicNilov प्रासंगिक है क्योंकि जावास्क्रिप्ट शैली प्रतीकों के बारे में हैश कुंजी के रूप में है और अनुमतियाँ, भ्रामक, संदर्भ निर्भर हैं।
म्यू बहुत कम है

सहमत नहीं हो सकते। प्रतीक द्वारा हैश स्लॉट को संबोधित करते समय आप हमेशा h[:s] = 42नोटेशन का उपयोग करते हैं। कोई अन्य विकल्प नहीं है। जब आप कुंजी / मान जोड़े को परिभाषित करते हैं तो आपको { key: value }जावास्क्रिप्ट शैली या { :key => value }हैश्रोकेट शैली के विकल्प मिलते हैं। ध्यान केंद्रित करने के लिए संबोधन परिदृश्य अभी भी प्रासंगिक नहीं है।
निक निलोव

11

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


5

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


4

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


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

1

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

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

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


पर्ल और PHP दोनों का उपयोग करें =>। मुझे लगता है कि रूबी, पर्ल से बहुत प्रेरित हो रही है, पर्ल से वाक्यविन्यास उधार लिया :)
डैनियल सेरोडियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.