2012-08-03 11 views
14

मैं [] और Array.new और {} और Hash.new के बीच अधिक मतभेदअक्षर और रचनाकारों के बीच मतभेद? ([] बनाम Array.new और {} बनाम Hash.new)

मैं इस पर एक ही मानक भाग गया पता करने के लिए उत्सुक था और लगता है shorthands तरह विजेताओं

require 'benchmark' 

many = 500000 

Benchmark.bm do |b| 
    b.report("[]   \t") {many.times { [].object_id }} 
    b.report("Array.new \t") { many.times { Array.new.object_id }} 
    b.report("{}   \t") {many.times { {}.object_id }} 
    b.report("Hash.new\t") { many.times { Hash.new.object_id }} 
end 


        user  system  total  real 
[]   0.080000 0.000000 0.080000 ( 0.079287) 
Array.new  0.180000 0.000000 0.180000 ( 0.177105) 
{}   0.080000 0.000000 0.080000 ( 0.079467) 
Hash.new  0.260000 0.000000 0.260000 ( 0.264796) 

मैं व्यक्तिगत रूप से आशुलिपि है एक [] और {}, कोड इतना शांत और पठनीय लग रहा है का उपयोग करना चाहते हैं।

कोई अन्य सूचक जो उनके बीच अंतर है? दृश्य के पीछे क्या होता है जो इसे इतना बेहतर बनाता है, और यदि कोई इसका उपयोग कब करता है तो सुझाव?

मुझे यह link मिला लेकिन अधिक जानकारी प्राप्त करने के लिए देख रहा था।

चीयर्स।

+1

'हैश.न्यू (0)'? –

उत्तर

22

हैश.न्यू के साथ आप अनसेट कुंजी के लिए हैश का डिफ़ॉल्ट मान सेट कर सकते हैं। यदि आप आंकड़े कर रहे हैं तो यह काफी उपयोगी है, क्योंकि Hash.new(0) आपको स्पष्ट रूप से प्रारंभ किए बिना कुंजी को बढ़ाने देगा।

+1

+1 एक सामान्य विशिष्ट मामले को इंगित करने के लिए। –

+0

@ रॉबर्ट धन्यवाद उपयोग केस निर्दिष्ट करने के लिए धन्यवाद, बहुत अच्छा – PriteshJ

4

तो आधे मिलियन बार वे सभी "बहुत जल्दी" भाग गए। मैं में किसी भी भाषा ([], {}, 0, "" इत्यादि) में शाब्दिक पसंद करते हैं, लेकिन शाब्दिक सब कुछ नहीं कर सकते हैं (अन्य constructor forms के लिए documentation देखें)। स्वच्छ कोड लिखें, और एकरूपता के: यहाँ कोई समस्या नहीं :)

हालांकि, मैं संदिग्ध शाब्दिक बचने एक निरंतर देखने और एक विधि कॉल जो कम से कम है कि में उन्हें प्राप्त होता है, तेजी से किया जा रहा है विशेष कार्यान्वयन .. (अधिक स्मार्ट के साथ किसी की तुलना में मेरे मध्यवर्ती एएसटी पर दिखाई दे सकता है साबित करने के लिए उत्पन्न/इस खंडन।)

है यही कारण है कि, क्या हुआ अगर Hash एक कस्टम वर्ग या Hash.new का संकल्प एक साथ बदल दिया गया था कस्टम विधि? {} के साथ ऐसा नहीं कर सकता। इसके अलावा, विधियों को अतिरिक्त तर्क (या ब्लॉक) से निपटने के लिए है जबकि अक्षर नहीं हैं।

+0

मैंने कभी इस बारे में सोचा नहीं है "हैश.न्यू एक कस्टम विधि के साथ प्रतिस्थापित कर सकते हैं, {}" के साथ ऐसा नहीं कर सकता। अच्छा पकड़ – PriteshJ

+0

@PriteshJ मुझे आशा है कि मैं इस तरह के कोड में कभी नहीं दौड़ूंगा :) –

+0

ya बिल्कुल इस बात को जानना बहुत अच्छा है, धन्यवाद – PriteshJ

2

Robert already mentioned तुम भी Hash.new के ब्लॉक प्रकार के साथ compley 'default'-मूल्यों का उपयोग कर सकते Hash.new

का डिफ़ॉल्ट मान:

x = Hash.new { |hash, key| 
    hash[key] = key * 2 
} 

p x  #-> {} 
p x[1] #-> 2 
p x  #-> {1=>2} 

Array.new भी मूलभूत मूल्यों प्राप्त करने के लिए इस्तेमाल किया जा सकता:

p Array.new(5, :a) #-> [:a, :a, :a, :a, :a] 
संबंधित मुद्दे