`और विधि (: फ़ंक्शन)` का क्या अर्थ है?


15

क्या &method(:function)मतलब है? उदाहरण के लिए, मेरे पास यह पंक्ति है:

res = integrate(0, 1, a, &method(:function))

दो उत्कृष्ट उत्तर (अब तक)। तुम भाग्यशाली हो!
कैरी स्वेवेलैंड

जवाबों:


13

कहो हमारे पास एक विधि है

def add_one(num)
  num + 1
end

और तार की एक सरणी

arr = ["1", "2"]

हम mapस्ट्रिंग्स की सूची उनके संबंधित आउटपुट से चाहते हैंadd_one

शुरू करने के लिए हम कॉल कर सकते हैं

nums = arr.map(&:to_i)

यह भी वैसी ही बात है

nums = arr.map do |str|
  str.to_i
end

आप देख सकते हैं कि रूबी में मानचित्र (और: नाम) का क्या अर्थ है? इस बारे में अधिक जानकारी के लिए।

हालाँकि, यह कॉल करने के लिए काम नहीं करेगा:

nums.map(&:add_one)

क्यों? क्योंकि नंबरों का कोई बिल्ट इन मेथड नहीं है add_one। तो आप ए NoMethodError

इसलिए, केवल एक विधि नाम प्रदान करने के बजाय :add_oneआप एक बाध्य विधि पास कर सकते हैं method(:add_one):

nums.map(&method(:add_one))

अब, विधि के लिए रिसीवर के रूप में उपयोग किए जाने वाले प्रत्येक संख्या के बजाय add_one, उन्हें तर्क के रूप में उपयोग किया जाएगा । तो, यह अनिवार्य रूप से एक ही है:

nums.map do |num|
  add_one(num)
end

एक और उदाहरण देने के लिए, निम्नलिखित की तुलना करें:

[1].map(&:puts)
# this is the same as [1].map { |num| num.puts }
# it raises NoMethodError

[1].map(&method(:puts))
# this is the same as [1].map { |num| puts num }
# it prints 1 successfully

नाइटपिक: Object#methodएक बाउंड लौटाता है Method, ए नहीं UnboundMethod। विधि एक रिसीवर के लिए बाध्य है क्योंकि आप इसे एक उदाहरण पर कॉल कर रहे हैं और यह इस प्रकार जानता है कि क्या selfहै, जबकि Module#instance_methodरिटर्न UnboundMethodक्योंकि यह पता नहीं चल सकता है कि यह किस उदाहरण के साथ उपयोग किया जाएगा।
जॉर्ग डब्ल्यू मित्तग

@ JörgWMittag ठीक है सुधार के लिए धन्यवाद, आप सही हैं मैं इसे मिला .instance_methodरहा हूँ क्योंकि मैं अभी (दोषपूर्ण) स्मृति से जा रहा था
अधिकतम pleaner

10

method(:function)अंतर्निहित रिसीवर (यानी ) को एक संदेश भेजें (कभी-कभी एक विधि कॉल कहा जाता है self)। यह एकमात्र तर्क के रूप में गुजरता हुआ method(यानी self) निहित संदेश को संदेश भेज रहा :functionहै।

:functionएक Symbolशाब्दिक है, अर्थात यह एक का शाब्दिक अंकन है SymbolSymbolएक डेटा प्रकार "कुछ का नाम" का प्रतिनिधित्व करता है।

एकतरफा उपसर्ग एम्परसेंड &ऑपरेटर Procएक ब्लॉक में "अनरोल" करता है । यानी यह आपको Procएक ब्लॉक से गुजरने की उम्मीद है। यदि ऑब्जेक्ट पहले से ही नहीं है Proc, तो इसे to_procसंदेश भेजा जाएगा जो इसे खुद को एक में बदलने की अनुमति देगा Proc। (ऑपरेटर एक तर्क सूची में केवल कानूनी है और केवल अंतिम तर्क के लिए है। यह &पैरामीटर सूची में सर्जन का दोहरी है , जो किसी Procऑब्जेक्ट में ब्लॉक को "रोल" करता है ।)

Procनिष्पादन योग्य कोड का प्रतिनिधित्व करने वाला डेटाटाइप है। यह प्रथम श्रेणी के सबरूटीन के लिए रूबी का मुख्य पुस्तकालय वर्ग है।

तो, यह क्या करता है, कहते हैं methodपर विधि selfके साथ :functionतर्क के रूप में, कॉल to_procवापसी मान पर, "उतारना" जिसके परिणामस्वरूप Procएक में वस्तु ब्लॉक और करने के लिए कॉल करने के लिए है कि ब्लॉक पारित integrateकी तरह के रूप में यदि आप कुछ लिखा था

res = integrate(0, 1, a) do
  # something
end

यहां methodविधि सबसे अधिक संभावना है, Object#methodविधि, जो एक बाध्य Method वस्तु लौटाती है ।

तो, सभी में, यह कुछ हद तक बराबर है

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end

लेकिन जिसे आम तौर पर पॉइंटफ्री स्टाइल कहा जाता है, उसमें व्यक्त किया गया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.