কী &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একটি নয়, একটি বাউন্ড দেয় । পদ্ধতিটি একটি রিসিভারের সাথে আবদ্ধ কারণ আপনি এটি একটি উদাহরণে কল করছেন এবং এটি এটি কী তা জানে , কারণ এটি কোনওটি ফেরত দেয় কারণ এটি কোন উদাহরণটি ব্যবহার করতে চলেছে তা জানে না। MethodUnboundMethodselfModule#instance_methodUnboundMethod
.instance_methodযাচ্ছিলাম কারণ আমি কেবল (ত্রুটিযুক্ত) স্মৃতি দিয়ে
method(:function)অন্তর্নিহিত রিসিভারকে (অর্থাত ) কোনও বার্তা প্রেরণ (কখনও কখনও একটি পদ্ধতি কল বলা হয় self)। এটি methodনিখুঁত যুক্তি হিসাবে selfপাস করে নিখুঁত রিসিভারকে (অর্থাত ) বার্তা পাঠাচ্ছে :function।
:functionএটি একটি Symbolআক্ষরিক, অর্থাত্ এটি আ এর আক্ষরিক স্বরলিপি Symbol। Symbol"কোনও কিছুর নাম" উপস্থাপন করে এমন একটি ডেটা টাইপ।
অ্যানারি উপসর্গ অ্যাম্পারস্যান্ড &অপারেটর Procএকটি ব্লকে "তালিকাভুক্ত" করে । অর্থাৎ এটি আপনাকে Procযেখানে ব্লক প্রত্যাশিত তা পাস করতে দেয় । যদি অবজেক্টটি ইতিমধ্যে একটি না হয় তবে Procএটি to_procবার্তা প্রেরণ করা হবে যা এটিকে নিজের মধ্যে রূপান্তর করতে দেয় Proc। (অপারেটরটি কেবল একটি আর্গুমেন্ট তালিকায় বৈধ এবং কেবল সর্বশেষ যুক্তির জন্য is এটি &প্যারামিটার তালিকার সিগিলের দ্বৈত , যা কোনও 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
তবে যা সাধারণত পয়েন্টফ্রি শৈলী বলে অভিহিত করা হয় ।