2009-12-12 16 views
13

मुझे नहीं पता कि यह एक हैश मुद्दा या एक ऐरे मुद्दा है, लेकिन मुझे पता नहीं है कि डेटा से भरा हैश प्राप्त करने के लिए तीसरे उदाहरण में तारांकन (*) संकेत क्यों आवश्यक है। इसके बिना, यह एक खाली हैश आउटपुट करता है।मुझे सरणी से पहले तारांकन की आवश्यकता क्यों है?

# -*- coding: utf-8 -*- 
require 'pp' 
pp [[:first_name, 'Shane'], [:last_name, 'Harvie']] 
# => [[:first_name, "Shane"], [:last_name, "Harvie"]] 

pp [[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten 
# => [:first_name, "Shane", :last_name, "Harvie"] 

pp Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 
# => {:first_name=>"Shane", :last_name=>"Harvie"} 

pp Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 
# => {} 

नीचे विधि का एक स्पष्टीकरण है।

--------------------------------------------------------------- Hash::[] 
    Hash[ [key =>|, value]* ] => hash 

    From Ruby 1.8 
------------------------------------------------------------------------ 
    Creates a new hash populated with the given objects. Equivalent to 
    the literal +{ _key_, _value_, ... }+. Keys and values occur in 
    pairs, so there must be an even number of arguments. 

     Hash["a", 100, "b", 200]  #=> {"a"=>100, "b"=>200} 
     Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} 
     { "a" => 100, "b" => 200 }  #=> {"a"=>100, "b"=>200} 

उत्तर

30

सूचक ऑपरेटर (कि, * है) बदल जाता है क्या अन्यथा हैश के भीतर कार्य के लिए एक सूची में एक सरणी होगा। आपको [] ऑपरेटर को हैश की कुंजी/मान जोड़े में बदलने के लिए एक वास्तविक सूची देना है। (स्प्लट ऑपरेटर के संक्षिप्त विवरण के लिंक के लिए नीचे देखें जो वास्तव में ऐसा कर सकता है (एक सरणी को किसी सूची में खोलें) या रिवर्स (एक सरणी में एक सूची एकत्र करें)।)

जिस तरह से आपने इसे ऊपर किया , आप Hash[]आइटमों की एक अजीब संख्या, अर्थात् एक एकल सरणी देते हैं। ([[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten उत्पादन के बारे में सोचें। यह [:first_name, 'Shane', :last_name, 'Havie'] उत्पन्न करता है।) जैसा कि आपने उद्धृत दस्तावेज़ों का कहना है, [] ऑपरेटर में तत्वों की संख्या भी होनी चाहिए। ध्यान दें कि निम्न (हालांकि बेकार) करता काम: जब कोड आप ऊपर है का उपयोग कर

>> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1] 
=> {[:first_name, "Shane", :last_name, "Harvie"]=>1} 

(यह मेरे लिए स्पष्ट नहीं तुम क्यों त्रुटि "हैश के लिए बहस की विषम संख्या" नहीं मिलता है - के रूप में यदि आप Hash[1] आज़माते हैं तो आप करते हैं।)

एक आसान उदाहरण इसे स्पष्ट कर सकता है। सबसे पहले, एक आइटम, एक सरणी में गुजर रहा है।

>> Hash[['foo', 'bar', 'bizz', 'buzz']] 
=> {} 
>> Hash[*['foo', 'bar', 'bizz', 'buzz']] 
=> {"foo"=>"bar", "bizz"=>"buzz"} 

पूरा विवरण दिया गया के लिए this blog post देखें: खोलने * के साथ सरणी Hash[] मदों की एक सूची सौंपने के लिए। आपको this short write-up about the splat operator भी उपयोगी मिल सकता है।

+0

आपके विस्तृत स्पष्टीकरण और लिंक के लिए बहुत बहुत धन्यवाद। अब मैं पूरी तरह से समझता हूं कि यह क्या है। अब सब कुछ समझ में आता है। –

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