2012-08-28 9 views
6

मैं एक सरणी की तरह स्थिति द्वारा हैश मान प्राप्त करना चाहता हूं।रूबी में स्थिति के आधार पर हैश मान कैसे प्राप्त करें?

उदाहरण: h = Hash["a" => 100, "b" => 200]

इस सरणी जब हम कहते हैं ज [0], यह देखते हुए सरणी में पहला तत्व देता है।

हैश में वही बात संभव है? यदि यह है, तो कैसे?

अग्रिम में धन्यवाद, प्रसाद।

+1

हैश और व्यवस्था रूबी में togethr अच्छी तरह से जाना नहीं है, ताकि आप बेहतर बजाय एक सरणी का उपयोग कर दिया जाएगा। – oldergod

उत्तर

5

वैसे स्थिति ऐसी स्थिति है जो हैश में बहुत अच्छी तरह परिभाषित नहीं है क्योंकि परिभाषा के अनुसार यह एक असाधारण सेट है।

irb(main):001:0> h = {:a => 1, :b => 2} 
=> {:b=>2, :a=>1} 
irb(main):002:0> h.to_a 
=> [[:b, 2], [:a, 1]] 
0

आप केवल कुंजी द्वारा तत्वों प्राप्त कर सकते हैं: फिर भी आप ऐसी बात आप सरणी के लिए हैश परिवर्तित कर सकते हैं और उसके बाद जिस तरह से तुम्हें पता है आगे बढ़ना करने के लिए सक्षम होने की बात पर जोर देते हैं। हैश एक संरचना है जहां एक सेट में कोई आदेश नहीं है।

+0

रूबी 1.9.3 के बाद से सच नहीं है – mykola

1

सीधे शब्दों में इस तरह:

h.values[0] 
# or 
h.keys[0] 

लेकिन तत्वों का क्रम अपरिभाषित हैं, हो सकता है वे आदेश आप उन्हें प्राप्त करना चाहते हैं में नहीं हैं।

0

हैश मान केवल अन्य उत्तरों में बताए गए अनुसार चाबियों द्वारा उपयोग किए जा सकते हैं। सरणी की अनुक्रमणिका संपत्ति हैश में समर्थित नहीं है। यदि आप रूबी में ऑर्डर किए गए हैंश का उपयोग करना चाहते हैं तो आप ActiveSupport :: OrderedHash का उपयोग कर सकते हैं, लेकिन मुझे नहीं लगता कि आप इस सुविधा की तलाश में हैं।

9

ऊपर उल्लेख किया है, आपके उपयोग के मामले पर निर्भर करता है, तो आप इस के साथ क्या कर सकते हैं:

h.keys[0] 
    h.values[0] 
    h.to_a[0] 

रूबी 1.9.1 के बाद से Hash प्रविष्टि आदेश को बरकरार रखता है। यदि आपको रूबी 1.8 संगतता की आवश्यकता है ActiveSupport::OrderedHash एक अच्छा विकल्प है।

2

आप हैश विस्तार कर सकते हैं आपको क्या चाहिए पाने के लिए (माणिक 1.9.x) इस प्रकार है:

class Hash 
    def last    # first is already defined 
    idx = self.keys.last 
    [idx , self[idx]] 
    end 
    def array_index_of(n) # returns nth data 
    idx = self.keys[n] 
    self[idx] 
    end 
end 

h = {"a" => 100, "b" => 200} 
h.first # ["a", 100] 
h.last # ["b", 200] 

h.array_index_of(0) # => 100 
h.array_index_of(1) # => 200