`& পদ্ধতি (: ফাংশন) What এর অর্থ কী?


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একটি নয়, একটি বাউন্ড দেয় । পদ্ধতিটি একটি রিসিভারের সাথে আবদ্ধ কারণ আপনি এটি একটি উদাহরণে কল করছেন এবং এটি এটি কী তা জানে , কারণ এটি কোনওটি ফেরত দেয় কারণ এটি কোন উদাহরণটি ব্যবহার করতে চলেছে তা জানে না। MethodUnboundMethodselfModule#instance_methodUnboundMethod
জার্গ ডব্লু মিত্তাগ

@ জার্গডব্লিউমিত্যাগ সংশোধনের জন্য ধন্যবাদ, আপনি ঠিক বলেছেন আমি অবশ্যই এটির সাথে মিশে .instance_methodযাচ্ছিলাম কারণ আমি কেবল (ত্রুটিযুক্ত) স্মৃতি দিয়ে
যাচ্ছিলাম

10

method(:function)অন্তর্নিহিত রিসিভারকে (অর্থাত ) কোনও বার্তা প্রেরণ (কখনও কখনও একটি পদ্ধতি কল বলা হয় self)। এটি methodনিখুঁত যুক্তি হিসাবে selfপাস করে নিখুঁত রিসিভারকে (অর্থাত ) বার্তা পাঠাচ্ছে :function

:functionএটি একটি Symbolআক্ষরিক, অর্থাত্ এটি আ এর আক্ষরিক স্বরলিপি SymbolSymbol"কোনও কিছুর নাম" উপস্থাপন করে এমন একটি ডেটা টাইপ।

অ্যানারি উপসর্গ অ্যাম্পারস্যান্ড &অপারেটর 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

তবে যা সাধারণত পয়েন্টফ্রি শৈলী বলে অভিহিত করা হয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.