มีวิธีในทับทิมเพื่อค้นหาชื่อวิธีการโทรภายในของวิธี?
ตัวอย่างเช่น:
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"
ตัวควบคุมผลตอบแทนนี้ ฉันเดาว่านี่สำหรับ Ruby เท่านั้น
ใน Ruby 2.0.0 คุณสามารถใช้:
caller_locations(1,1)[0].label
มันได้เร็วขึ้นมากกว่าวิธีทับทิม 1.8+:
caller[0][/`([^']*)'/, 1]
จะรวมอยู่ในbackports
เมื่อฉันได้รับเวลา (หรือคำขอดึง!)
caller_locations[0].label
Ruby 2.2.0 ไม่เช่นนั้นคุณจะได้send_action
ผลลัพธ์เสมอ
ใช้caller_locations(1,1)[0].label
(สำหรับทับทิม> = 2.0)
แก้ไข : คำตอบของฉันกำลังบอกว่าจะใช้__method__
แต่ฉันผิดมันกลับชื่อวิธีปัจจุบัน
ฉันใช้
caller[0][/`([^']*)'/, 1]
'
เกินที่คุณกำลังมองหา (และฉันคิดว่ามันไม่สามารถทำได้) ผลลัพธ์จะเหมือนกันอย่างแน่นอน อย่างไรก็ตาม[^']*
จะทำงานได้ดีขึ้นเนื่องจากเอ็นจิ้น regex จะหยุดพยายามจับคู่ส่วนนั้นในช่วงเวลาที่มันมาถึง'
(เวอร์ชั่นของคุณจะไปจนจบจากนั้นย้อนกลับเพราะมันไม่พบ'
จุดสิ้นสุด) ความแตกต่างนั้นค่อนข้างเล็กน้อยในกรณีนี้ แต่มันก็เป็นนิสัยที่ดีที่จะหลีกเลี่ยง.
ใน regexes ถ้าเป็นไปได้
เกี่ยวกับ
caller[0].split("`").pop.gsub("'", "")
IMO ที่สะอาดกว่ามาก
แต่คุณสามารถเขียนมันเป็นฟังก์ชั่นห้องสมุดและโทรออกได้ทุกที่ที่ต้องการ รหัสจะเป็นดังนี้:
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
หากต้องการดูข้อมูลผู้โทรและรับสายในภาษาใด ๆ ไม่ว่าจะเป็น ruby หรือ java หรือ python คุณจะต้องดูที่การติดตามสแต็กเสมอ ในบางภาษาเช่น Rust และ C ++ มีตัวเลือกในตัวคอมไพเลอร์เพื่อเปิดกลไกการทำโปรไฟล์บางประเภทที่คุณสามารถดูได้ในระหว่างเวลาทำงาน ฉันเชื่อว่ามีอยู่จริงสำหรับ Ruby ที่เรียกว่า ruby-prof
และดังที่ได้กล่าวไว้ข้างต้นคุณสามารถมองเข้าไปในกองการประมวลผลสำหรับทับทิม Stack การประมวลผลนี้เป็นอาร์เรย์ที่มีวัตถุตำแหน่งย้อนหลัง
สิ่งสำคัญที่คุณต้องรู้เกี่ยวกับคำสั่งนี้มีดังนี้:
ผู้เรียก (start = 1, length = nil) → array หรือ nil