2011-08-30 20 views

उत्तर

11

a और b आइटम की एक जोड़ी का प्रतिनिधित्व करते हैं। यह आपकी मूल सूची से बाहर ले जाया जा सकता है। <=> को आमतौर पर स्पेसशिप ऑपरेटर कहा जाता है। यदि 0 आइटम दो बराबर हैं, तो यह 0 लौटाता है, -1 यदि बाईं ओर वाला एक छोटा है, और 1 यदि दाईं ओर वाला एक छोटा है।

the spaceship operator in the Ruby API docs पर और जानकारी है। यह फिक्सनम पर एक के लिए डॉक्टर है क्योंकि यह आपके उदाहरण में था, लेकिन आप वहां फ्लोट, स्ट्रिंग इत्यादि की परिभाषा भी देख सकते हैं।

अपडेटेडःsort फ़ंक्शन स्पेसशिप ऑपरेटर के समान व्यवहार का पालन करने के लिए दिए गए ब्लॉक की अपेक्षा करता है। यदि पहला तर्क, a पहले क्रमबद्ध किया जाना चाहिए, -1 वापस किया जाना चाहिए; यदि दूसरा तर्क, b पहले क्रमबद्ध किया जाना चाहिए, 1 वापस किया जाना चाहिए; और इसी तरह। तो list.sort { |a,b| a + b } के उदाहरण में आप कह रहे हैं कि दूसरा तर्क हर बार बड़ा होता है, क्योंकि a + b उस सूची में प्रत्येक संभावित संयोजन के लिए 1 से अधिक है। तो जब आप [5,3,1,4,2] प्राप्त करते हैं तो आप जो देख रहे हैं वह मूल रूप से आदेश का एक आर्टिफैक्ट है कि तत्व ब्लॉक में पास किए जाते हैं और संभवतः रुबी कार्यान्वयन में स्थिर नहीं होंगे।

+3

के बारे में नहीं है? पहली बार मैंने इसे 'स्पेसशिप ऑपरेटर' कहा; पी – Mchl

+2

प्रश्न पर रायन की टिप्पणी में http://en.wikipedia.org/wiki/Spaceship_operator और "संभावित डुप्लिकेट" लिंक भी देखें। – Emily

+1

हाँ मुझे विश्वास है कि इसे इस तरह कहा जाता है। मुझे आश्चर्य है कि मुझे इससे पहले सामना नहीं हुआ;) – Mchl

3

मैं पीछे की ओर आपके प्रश्न का उत्तर देंगे:

<=> रूबी के संयुक्त तुलना ऑपरेटर है, और आप इसे के रूप में कम हाथ का उपयोग निर्धारित करने के लिए जो दो चर का अधिक से अधिक है सकते हैं। आपके उदाहरण में, यदि b अधिक है तो यह 1 लौटाएगा, अगर ab के बराबर है तो यह 0 वापस आ जाएगा, और यदि a अधिक है तो यह -1 वापस आ जाएगा।

यह देखते हुए कि list.sortblock को शामिल करने की अनुमति देता है - यानी, कोड का एक मनमाना टुकड़ा जो फ़ंक्शन के कुछ डिफ़ॉल्ट व्यवहार को प्रतिस्थापित करेगा।

घुंघराले ब्रेसिज़ के बीच आप यही देखते हैं: { |a,b| b <=> a } एक फ़ंक्शन है, और a और b आपकी सूची से दो आइटम हैं जिनकी तुलना की जानी चाहिए। यह फ़ंक्शन के शरीर का उपयोग करके करता है, b <=> a, और इस मामले में, आरोही क्रम के विपरीत अवरोही में सूची को टाइप करता है।

इस तरह, आप पूरे सॉर्टिंग फ़ंक्शन को फिर से लिखने के बिना किसी सूची में आइटम को सॉर्ट करने के कई अलग-अलग तरीकों से हो सकते हैं - आपको केवल उस अनुभाग को आपूर्ति करने की आवश्यकता है जो निर्धारित करता है कि सूची में कौन से दो आइटम पहले जाते हैं।

-1

{| ए, बी | < => बी} "सॉर्ट ए, बी से पहले" के बारे में सोचा जा सकता है यदि "< = b" आरोही {| b, a | < => बी} "सॉर्ट बी, पहले से पहले" अगर "< = b" अवरोही

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