क्या &method(:function)मतलब है? उदाहरण के लिए, मेरे पास यह पंक्ति है:
res = integrate(0, 1, a, &method(:function))
क्या &method(:function)मतलब है? उदाहरण के लिए, मेरे पास यह पंक्ति है:
res = integrate(0, 1, a, &method(:function))
जवाबों:
कहो हमारे पास एक विधि है
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क्योंकि यह पता नहीं चल सकता है कि यह किस उदाहरण के साथ उपयोग किया जाएगा।
.instance_methodरहा हूँ क्योंकि मैं अभी (दोषपूर्ण) स्मृति से जा रहा था
method(:function)अंतर्निहित रिसीवर (यानी ) को एक संदेश भेजें (कभी-कभी एक विधि कॉल कहा जाता है self)। यह एकमात्र तर्क के रूप में गुजरता हुआ method(यानी self) निहित संदेश को संदेश भेज रहा :functionहै।
:functionएक Symbolशाब्दिक है, अर्थात यह एक का शाब्दिक अंकन है Symbol। Symbolएक डेटा प्रकार "कुछ का नाम" का प्रतिनिधित्व करता है।
एकतरफा उपसर्ग एम्परसेंड &ऑपरेटर 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
लेकिन जिसे आम तौर पर पॉइंटफ्री स्टाइल कहा जाता है, उसमें व्यक्त किया गया ।