$0
শীর্ষ স্তরের রুবি প্রোগ্রামের জন্য পরিবর্তনশীল, তবে বর্তমান পদ্ধতির জন্য এখানে কি একটি রয়েছে?
$0
শীর্ষ স্তরের রুবি প্রোগ্রামের জন্য পরিবর্তনশীল, তবে বর্তমান পদ্ধতির জন্য এখানে কি একটি রয়েছে?
উত্তর:
আমার প্রথম উত্তরের চেয়েও ভাল আপনি____ আদর্শ__ ব্যবহার করতে পারেন:
class Foo
def test_method
__method__
end
end
এটি প্রতীক প্রদান করে - উদাহরণস্বরূপ :test_method
,। স্ট্রিং হিসাবে পদ্ধতির নামটি ফিরতে, __method__.to_s
পরিবর্তে কল করুন।
দ্রষ্টব্য: এর জন্য রুবি দরকার 1.8.7।
__method__.to_s
এবং এটি পদ্ধতির নাম
Http://snippets.dzone.com/posts/show/2785 থেকে :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__callee__
না?
আপনি আসলে চান তার উপর ভিত্তি করে, আপনি ব্যবহার করতে পারেন __method__
বা __callee__
, যা একটি প্রতীক হিসেবে বর্তমানে নির্বাহ পদ্ধতি নাম ফিরে যান।
রুবি ১.৯-এ, উভয়ই একইরকম আচরণ করে (যতদূর ডক্স এবং আমার পরীক্ষার বিষয় হিসাবে বিবেচিত )।
রুবিতে 2.1 এবং 2.2 এ __callee__
আপনি আলাদাভাবে আচরণ করে যদি আপনি সংজ্ঞায়িত পদ্ধতির কোনও উপাধি কল করেন। ডক্স দুই জন্য বিভিন্ন আছেন:
__method__
: "বর্তমান পদ্ধতির সংজ্ঞা অনুসারে নাম" (যেমন নামটি এটি সংজ্ঞায়িত করা হয়েছিল)__callee__
: "বর্তমান পদ্ধতির পরিচিত নাম" (যেমন এটি নাম হিসাবে পরিচিত (আহবান করা হয়েছে))পরীক্ষার স্ক্রিপ্ট:
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 আউটপুট:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
২.১.২ আউটপুট (পৃথক __callee__
নামটি প্রদান করে, তবে __method__
পদ্ধতিটি সংজ্ঞায়িত অবস্থায় নামটি দেয়):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
রুবি ১.৯+ এর জন্য আমি ব্যবহার করার পরামর্শ দিই __callee__
__callee__
1.9 এর আগে আলাদা আচরণ করে, সুতরাং এটির সাথে __method__
সঙ্গতিপূর্ণ আচরণ করা ভাল কারণ এটির ধারাবাহিক আচরণ রয়েছে। ১.৯-এর পরে __callee__
একই আচরণ করে __method__
।
def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
আপনি কি অদ্ভুত কিছু দেখছেন না?
__callee__
এবং __method__
এর আলাদা আচরণ রয়েছে। দেখুন pastie.org/10380985 (রুবি 2.1.5)
ভিউ ফাইলটিতে পদ্ধতির নাম পুনরুদ্ধার করতে আমি একই সমস্যা পেয়েছি। আমি সমাধান পেয়েছিলাম
params[:action] # it will return method's name
আপনি যদি নিয়ামকের নামটি পেতে চান তবে
params[:controller] # it will return you controller's name
super
করা একটি সরলডেলিগেটর অবজেক্টের মধ্যে কল করা যেতে পারে:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end