কলিং পদ্ধতির নাম কীভাবে পাবেন?


161

রুবিতে কোনও পদ্ধতির ভিতরে কলিংয়ের নামটি খুঁজে পাওয়ার কোনও উপায় আছে?

উদাহরণ স্বরূপ:

class Test
  def self.foo
    Fooz.bar
  end
end

class Fooz
  def self.bar
    # get Test.foo or foo
  end
end



"রুবিতে বর্তমানে সম্পাদিত পদ্ধতির নাম পান" এর সদৃশ নয়। এই প্রশ্নটি বর্তমান পদ্ধতির নাম নয়, কলিং পদ্ধতির নাম জিজ্ঞাসা করে।
ওয়েইন কনরাড

উত্তর:


210
puts caller[0]

অথবা সম্ভবত...

puts caller[0][/`.*'/][1..-2]

5
হ্যাঁ, কার্নেল # কলার দেখুন, ওরফে রুবি-
ডক.আর.অর্গ.ওউর

10
এটি কলিং পদ্ধতির নাম দেয় তবে পদ্ধতিটি কোন মডিউল বা শ্রেণীর সাথে সম্পর্কিত তা কোনও নির্দেশ দেয় না। এটা কি সম্ভব?
থমথম

@ থমথম হ্যাঁ এটি সম্ভব আপনি ক্লাসের নামটি দেখতে নিজের নাম.ক্লাস.নামে কল করতে পারেন
থোরিন

স্ট্রিং ইনডেক্স হিসাবে রেগেক্সের দুর্দান্ত ব্যবহার! এছাড়াও ব্যবহার করতে পারেনcaller[0][/`(.*)'/,1]
aks

1
এটি 5.2.1 রেলগুলিতে কাজ করবে বলে মনে হচ্ছে না। কারা কন্ট্রোলারে এই ফিরে আসে "block in make_lambda"। আমার ধারণা এটি কেবল রুবির পক্ষে।
dcangulo

164

রুবি ২.০.০ এ আপনি ব্যবহার করতে পারেন:

caller_locations(1,1)[0].label

এটি রুবি 1.8+ সমাধানের চেয়ে অনেক দ্রুত :

caller[0][/`([^']*)'/, 1]

backportsআমি সময় পেলে অন্তর্ভুক্ত হয়ে যাব (বা একটি অনুরোধ!)।


এটি লক্ষ করার মতো যে এটি রুবিনিয়াসে নেই।
সর্বোচ্চ

1
যদি আপনি পিস ব্যবহার করে থাকেন তবে আপনাকে পিএস স্ট্যাকট্রেসটি এড়িয়ে চলতে হবে বলে মনে হচ্ছে ... এর কোনও ডিফল্ট সমাধান বলে মনে হচ্ছে না।
ডিসিটি

6
এখন এটি caller_locations[0].labelরুবি ২.২.০-তে রয়েছে বলে মনে হয় অন্যথায় আপনি সর্বদা send_actionফলাফল পেয়েছেন
16:25

1
আমরা কীভাবে কেবল কল অ্যাপ পদ্ধতিটি পেতে পারি এবং ফ্রেমওয়ার্ক কল উপেক্ষা করতে পারি?
ম্যাট্রিক্স

31

ব্যবহার করুন caller_locations(1,1)[0].label(রুবি জন্য> = 2.0)

সম্পাদনা : আমার উত্তরটি ব্যবহার করতে বলছিল __method__কিন্তু আমি ভুল ছিলাম এটি বর্তমান পদ্ধতির নামটি দেয়।


1
@ ওসওয়াল্ডোফেরিরা ধন্যবাদ, কোথাও অন্য একটি উত্তরে এটি পেয়েছেন
ডোরিয়ান

5
এটিকে অযথাযথ বলে, এটা ফেরৎ বর্তমান পদ্ধতি, না পদ্ধতি যা বর্তমান পদ্ধতি বলা ...
thrice801

1
একটি যাদুমন্ত্র মত কাজ করে. পূর্বের ২.০ পদ্ধতির তুলনায় অনেক দ্রুত বলে মনে হচ্ছে।
ড। স্ট্রেনজলভ

21

আমি ব্যবহার করি

caller[0][/`([^']*)'/, 1]

4
এই ওভার ডিজিটালরোস এর পদ্ধতির সুবিধা কী?
অ্যান্ড্রু গ্রিম

2
ক্লিনার এবং আরও সুনির্দিষ্ট অনুসন্ধান না করে বরং অবস্থানের ভিত্তিতে অযাচিত অক্ষরগুলি বিভক্ত করার জন্য একটি অ্যারে পদ্ধতি ব্যবহার করে (যা ভুল হতে পারে)।
নিউ আলেকজান্দ্রিয়া

2
কেন কেবল কলার ব্যবহার করবেন না [0] [/ `(। *) '/, 1]? আমি নিয়মিত অভিব্যক্তি সম্পর্কে গুরু নই, তবে এটি কার্যকর বলে মনে হচ্ছে।
কলিমার্কো

7
@ কললিমারকো যতক্ষণ না স্ট্রিংয়ের সন্ধান 'করছেন তার বাইরে যতক্ষণ না থাকে (এবং আমি ধরে নিই যে এটি পারবেন না), ফলাফলটি একই রকম হবে, নিশ্চিত sure তবে, [^']*রেগেক্স ইঞ্জিনটি আরও ভাল পারফরম্যান্স করবে কারণ এই অংশটি যে মুহূর্তে এটি পৌঁছায় সেই মুহুর্তটি মিলিয়ে যাওয়ার চেষ্টা বন্ধ করে দেবে '(আপনার সংস্করণটি শেষ দিকে যাবে, তারপরে ব্যাকট্র্যাক কারণ এটি শেষটি খুঁজে পায়নি ')। অবশ্যই এই ক্ষেত্রে পার্থক্যটি বেশ নগণ্য, তবে .যেখানে সম্ভব সেখানে রেজিজেস এড়ানো ভাল অভ্যাস ।
Thor84no

4

কেমন

caller[0].split("`").pop.gsub("'", "")

অনেক ক্লিনার ইমো।


3

পরিবর্তে আপনি এটি লাইব্রেরির ফাংশন হিসাবে লিখতে পারেন এবং যেখানে প্রয়োজন সেখানে কল করতে পারেন। কোডটি নিম্নরূপ:

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

কোড রেফারেন্স থেকে


1
একটি সম্ভাব্য সমাধানের একটি লিঙ্ক সর্বদা স্বাগত, তবে দয়া করে লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের এটি কী এবং কেন আছে তা কিছুটা ধারণা থাকতে পারে। টার্গেট সাইটটি যদি অ্যাক্সেসযোগ্য না হয় বা স্থায়ীভাবে অফলাইনে চলে যায় তবে সর্বদা গুরুত্বপূর্ণ লিঙ্কের সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন। বিবেচনায় রাখুন যে কোনও বাহ্যিক সাইটের লিঙ্কের চেয়ে সবেমাত্র বেশি হওয়া একটি সম্ভাব্য কারণ কেন এবং কীভাবে কিছু উত্তর মুছে ফেলা হয়?
জাভি লোপেজ

@ জাভিলিপেজ উত্তরটি আপডেট করেছেন, দয়া করে ভুল করছেন বা ভুল করে কিছু করা হচ্ছে কিনা দয়া করে সংশোধন করুন ... দয়া করে এই পরামর্শের জন্য ধন্যবাদ :)
অমিত কর্সলে

1
আপনার উত্তর উন্নতি করার জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে, আমার এই পোস্ট সম্পর্কে সঠিকভাবে মন্তব্য করতে সক্ষম হওয়ার জন্য রুবি সম্পর্কে পর্যাপ্ত জ্ঞান নেই, তবে উত্তরটি এখনই ঠিক আছে। আমি আমার ডাউনটোট সরিয়েছি শুভকামনা :-)
জাভি লোপেজ

2

যে কোনও ভাষায় কলার এবং কলি তথ্য দেখতে, এটি রুবি বা জাভা বা অজগর হোক না কেন, আপনি সর্বদা স্ট্যাকের সন্ধানটি দেখতে চাইবেন। কিছু ভাষায়, যেমন মরিচা এবং সি ++ এর মতো সংকলকটিতে বিকল্পগুলি অন্তর্ভুক্ত রয়েছে যাতে রানের সময় আপনি দেখতে পারেন এমন কোনও প্রকারের প্রোফাইলিং প্রক্রিয়া চালু করে। আমি রুবির পক্ষে রুবি-প্রো নামে পরিচিত, তার একমাত্র উপস্থিতি আছে।

এবং উপরে উল্লিখিত হিসাবে, আপনি রুবীর জন্য কার্যকর করা স্ট্যাকটি সন্ধান করতে পারেন। এই এক্সিকিউশন স্ট্যাকটি ব্যাকট্রেস লোকেশন অবজেক্ট যুক্ত অ্যারে containing

মূলত এই আদেশটি সম্পর্কে আপনার যা জানা দরকার তা হ'ল নিম্নরূপ:

কলার (শুরু = 1, দৈর্ঘ্য = শূন্য) → অ্যারে বা শূন্য

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