2012-06-13 22 views
5

में समतल मैं इतना भाषा रूबी के लिए जब मैं एक हैश मान से मैं इस विधि का इस्तेमाल किया सुलझाने के लिए सॉर्ट करने के लिए कोशिश कर रहा था नया हूँ:क्या * का मध्यमान है और गहरे लाल रंग का

movie_popularity.sort_by{|m,p| p}.reverse 

लेकिन प्रकार विधि एक सरणी देता है, जबकि मैं एक हैश तो वापस करने मैं इस आदेश का इस्तेमाल किया की जरूरत है:

movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten] 

मेरा प्रश्न उपरोक्त पंक्ति में * और flatten का अर्थ है क्या है?

धन्यवाद =)

उत्तर

10

* को "स्प्लट ऑपरेटर" कहा जाता है; मुझे यकीन नहीं है कि मैं आपको तकनीकी परिभाषा दे सकता हूं (हालांकि मुझे यकीन है कि आपको Google की मदद से जल्द ही मिल जाएगा), लेकिन जिस तरह से मैं इसका वर्णन करूंगा वह यह है कि यह मूल रूप से हाथ-लेखन एकाधिक स्थान लेता है कोड में अल्पविराम से अलग मूल्य।

इसे और अधिक ठोस बनाने के लिए, Hash[] के मामले पर विचार करें जिसे आपने अपने उदाहरण में उपयोग किया है। Hash वर्ग एक [] वर्ग विधि है जो तर्क के परिवर्तनशील लेता है और सामान्य रूप से इस तरह कहा जा सकता है है:

# Returns { "foo" => 1, "bar" => 2 } 
h = Hash["foo", 1, "bar", 2] 

सूचना कैसे है कि किसी सरणी या एक हैश या कुछ भी है कि मैं में पारित नहीं है, यह मूल्यों का एक (हाथ से लिखित) अनुक्रम है। * ऑपरेटर आपको मूल रूप से एक ही चीज को एक सरणी का उपयोग करने की अनुमति देता है - आपके मामले में, movie_popularity.sort_by{|m,p| p}.reverse.flatten द्वारा लौटाया गया।

कि flatten कॉल के लिए के रूप में: जब आप एक हैश पर sort_by कहते हैं, क्या तुम सच में Enumerable मॉड्यूल जो कक्षाओं की एक किस्म (सबसे विशेष रूप Array और Hash) कि गणन प्रदान में शामिल है लाभ कर रहे हैं। एक हैश के मामले में, आप शायद देखा है कि बजाय इस तरह से अधिक पुनरावृत्ति की:

hash.each { |value| ... } 

इसके बजाय आप ऐसा करते हैं:

hash.each { |key, value| ... } 

यही है, एक हैश पैदावार अधिक पुनरावृत्ति दो प्रत्येक पुनरावृत्ति पर मूल्य। तो आपके sort_by स्वयं पर कॉल जोड़े का अनुक्रम लौटाएगा। इस परिणाम पर flatten को कॉल करने से जोड़े को मानों के एक-आयामी अनुक्रम में गिरा दिया जाता है, जैसे:

# Returns [1, 2, 3, 4] 
[[1, 2], [3, 4]].flatten 
संबंधित मुद्दे