2016-04-09 4 views
13

रूबी 2.3:हैश में यह स्ट्रिंग कुंजी क्यों प्रतीक में परिवर्तित हो गई है?

उदाहरण 1 में, स्ट्रिंग कुंजी "a" स्वचालित रूप से एक प्रतीक में परिवर्तित हो जाती है, जबकि उदाहरण 2 के साथ, यह एक स्ट्रिंग रहता है।

उदाहरण 1

{"a": 1} 
# => {:a=>1} 

उदाहरण 2

{"a"=>"c"} 
# => {"a"=>"c"} 

मैंने सोचा था कि : पुरानी शैली हैश रॉकेट => वाक्य रचना के रूप में ही किया गया था। क्या हो रहा है? मैंने रेल में कभी यह क्यों नहीं देखा है? क्या यह HashWithIndifferentAccess है जो इसे अस्पष्ट कर रहा है?

+0

@Zabba क्यों आप उस संस्करण जोड़ने की जरूरत थी:

$ ruby -e ruby -e "h = {key: \"value\"}; puts h" $ ruby -e ruby -e "h = {:key => \"value\"}; puts h" $ ruby -e ruby -e "h = {\"key\": \"value\"}; puts h" $ ruby -e ruby -e "h = {:\"key\" => \"value\"}; puts h" $ ruby -e ruby -e "h = {\"#{:key}\": \"value\"}; puts h" 

एक ही परिणाम का उत्पादन होगा? यह केवल हाल ही में रूबी में काम करता है। यदि ओपी कहता है कि यह काम करता है, तो यह अनिवार्य है कि यह एक हालिया संस्करण है। – sawa

+2

ओपी प्रश्न में उस संस्करण का उल्लेख किया है, तो यह यह अर्थ और सवाल के इरादे बदल जाएगा को हटाने के बाद से इसे हटाने के लिए उपयुक्त नहीं है, तो बस यहाँ मूल जा रहा है। – Zabba

+1

यह एक स्ट्रिंग कुंजी नहीं है, यह एक प्रतीक कुंजी है। कुछ भी नहीं बदला जा रहा है। –

उत्तर

3

यह रूबी 1.9 के साथ पेश किए गए नए हैश सिंटैक्स की वजह से है। कोलन के साथ वाक्यविन्यास केवल प्रतीक कुंजी के साथ काम करता है। इसे "ऑब्जेक्ट का प्रतीक" हैश कहा जाता है और यह वहां मौजूद हैश की सबसे आम शैली के लिए केवल वाक्य रचनात्मक चीनी है। मेरे लिए एक और बिंदु, यह जावास्क्रिप्ट ऑब्जेक्ट नोटेशन के करीब है।

अगर मैं मिश्रित कुंजी प्रकार तो मैं पुरानी शैली (हैश रॉकेट सिंटेक्स) पसंद करते हैं, लेकिन यह आप पर निर्भर है। दो शैली को मिलाकर मुझे बदसूरत लग रहा है।

+2

यह रूबी 1.9 में पेश वाक्यविन्यास नहीं है। – sawa

+0

यह जावास्क्रिप्ट नोटेशन के करीब नहीं है। जावास्क्रिप्ट स्ट्रिंग्स और प्रतीकों को अलग नहीं करता है। – sawa

+2

@sawa नया वाक्यविन्यास रूबी 1.9 में पेश किया गया था और यह जावास्क्रिप्ट नोटेशन के करीब है। – Reyko

20

रूबी 2.3 (.0) में, इन सभी को एक ही कर रहे हैं:

{:"a" => 1} 
{"a": 1}, 
{:a => 1} 
{a: 1} 

वे सभी एक ही बात से अनुवाद करें: a इन सभी मामलों में एक प्रतीक है।

{"a"=>1} अलग है: a इस मामले में एक स्ट्रिंग है।

0

Ruby documentation के अनुसार:

Blockquote प्रतीक वस्तुओं के नाम और रूबी दुभाषिया के अंदर कुछ तार प्रतिनिधित्व करते हैं। वे: नाम और: "स्ट्रिंग" अक्षर सिंटैक्स का उपयोग करके उत्पन्न होते हैं, और विभिन्न to_sym तरीकों से। [...]

इसका मतलब है कि चल रहा है:

$ {:key=>"value"} 
संबंधित मुद्दे