রুবিতে কোনও পদ্ধতির ভিতরে কলিংয়ের নামটি খুঁজে পাওয়ার কোনও উপায় আছে?
উদাহরণ স্বরূপ:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
রুবিতে কোনও পদ্ধতির ভিতরে কলিংয়ের নামটি খুঁজে পাওয়ার কোনও উপায় আছে?
উদাহরণ স্বরূপ:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
উত্তর:
puts caller[0]
অথবা সম্ভবত...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
। আমার ধারণা এটি কেবল রুবির পক্ষে।
রুবি ২.০.০ এ আপনি ব্যবহার করতে পারেন:
caller_locations(1,1)[0].label
এটি রুবি 1.8+ সমাধানের চেয়ে অনেক দ্রুত :
caller[0][/`([^']*)'/, 1]
backports
আমি সময় পেলে অন্তর্ভুক্ত হয়ে যাব (বা একটি অনুরোধ!)।
caller_locations[0].label
রুবি ২.২.০-তে রয়েছে বলে মনে হয় অন্যথায় আপনি সর্বদা send_action
ফলাফল পেয়েছেন
ব্যবহার করুন caller_locations(1,1)[0].label
(রুবি জন্য> = 2.0)
সম্পাদনা : আমার উত্তরটি ব্যবহার করতে বলছিল __method__
কিন্তু আমি ভুল ছিলাম এটি বর্তমান পদ্ধতির নামটি দেয়।
আমি ব্যবহার করি
caller[0][/`([^']*)'/, 1]
'
করছেন তার বাইরে যতক্ষণ না থাকে (এবং আমি ধরে নিই যে এটি পারবেন না), ফলাফলটি একই রকম হবে, নিশ্চিত sure তবে, [^']*
রেগেক্স ইঞ্জিনটি আরও ভাল পারফরম্যান্স করবে কারণ এই অংশটি যে মুহূর্তে এটি পৌঁছায় সেই মুহুর্তটি মিলিয়ে যাওয়ার চেষ্টা বন্ধ করে দেবে '
(আপনার সংস্করণটি শেষ দিকে যাবে, তারপরে ব্যাকট্র্যাক কারণ এটি শেষটি খুঁজে পায়নি '
)। অবশ্যই এই ক্ষেত্রে পার্থক্যটি বেশ নগণ্য, তবে .
যেখানে সম্ভব সেখানে রেজিজেস এড়ানো ভাল অভ্যাস ।
পরিবর্তে আপনি এটি লাইব্রেরির ফাংশন হিসাবে লিখতে পারেন এবং যেখানে প্রয়োজন সেখানে কল করতে পারেন। কোডটি নিম্নরূপ:
module CallChain
def self.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailer
def self.parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
উপরের মডিউল পদ্ধতিটি ট্রিগার করার জন্য আপনাকে এই জাতীয় কল করতে হবে:
caller = CallChain.caller_method
যে কোনও ভাষায় কলার এবং কলি তথ্য দেখতে, এটি রুবি বা জাভা বা অজগর হোক না কেন, আপনি সর্বদা স্ট্যাকের সন্ধানটি দেখতে চাইবেন। কিছু ভাষায়, যেমন মরিচা এবং সি ++ এর মতো সংকলকটিতে বিকল্পগুলি অন্তর্ভুক্ত রয়েছে যাতে রানের সময় আপনি দেখতে পারেন এমন কোনও প্রকারের প্রোফাইলিং প্রক্রিয়া চালু করে। আমি রুবির পক্ষে রুবি-প্রো নামে পরিচিত, তার একমাত্র উপস্থিতি আছে।
এবং উপরে উল্লিখিত হিসাবে, আপনি রুবীর জন্য কার্যকর করা স্ট্যাকটি সন্ধান করতে পারেন। এই এক্সিকিউশন স্ট্যাকটি ব্যাকট্রেস লোকেশন অবজেক্ট যুক্ত অ্যারে containing
মূলত এই আদেশটি সম্পর্কে আপনার যা জানা দরকার তা হ'ল নিম্নরূপ:
কলার (শুরু = 1, দৈর্ঘ্য = শূন্য) → অ্যারে বা শূন্য