Ruby'de bir yöntemin içinde çağıran yöntem adını bulmak için bir yolu var mı?
Örneğin:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Ruby'de bir yöntemin içinde çağıran yöntem adını bulmak için bir yolu var mı?
Örneğin:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Yanıtlar:
puts caller[0]
ya da belki...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda". Sanırım bu sadece Ruby için.
Ruby 2.0.0'da şunları kullanabilirsiniz:
caller_locations(1,1)[0].label
Bu var çok daha hızlı Ruby 1.8+ çözümü daha:
caller[0][/`([^']*)'/, 1]
Dahil olur backportsZamanım aldığımda (veya bir çekme isteği!).
caller_locations[0].labelRuby 2.2.0 üzerinde gibi görünüyor, her zaman send_actionsonuç var
Kullanım caller_locations(1,1)[0].label(yakut için> = 2.0)
Düzenleme : Cevabım kullanmak söylüyordu __method__ama yanılmışım, geçerli yöntem adını döndürür.
kullanırım
caller[0][/`([^']*)'/, 1]
'aradığınızdan başka bir şey içermediği sürece (ve yapamayacağımı varsayıyorum), sonuç aynı olacaktır, elbette. Bununla birlikte, [^']*regex motoru, bir bölüme ulaştığı andaki ifadeyi eşleştirmeye çalışacağından daha iyi performans gösterecektir '(sürümünüz sonuna kadar, ardından sonunda bir bulamadığı için geri izleme '). Bu durumda elbette fark göz ardı edilebilir, ancak mümkün olduğunda normal .ifadelerden kaçınmak iyi bir alışkanlıktır .
Bunun yerine kitaplık işlevi olarak yazabilir ve gerektiğinde çağrı yapabilirsiniz. Kod aşağıdaki gibi gider:
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
Yukarıdaki modül yöntemini tetiklemek için şu şekilde aramanız gerekir:
caller = CallChain.caller_method
İster yakut, ister java veya python olsun, arayan ve arayan bilgileri herhangi bir dilde görmek için, her zaman yığın izlemesine bakmak istersiniz. Rust ve C ++ gibi bazı dillerde, derleyicide çalışma sırasında görüntüleyebileceğiniz bir tür profil oluşturma mekanizmasını açmak için seçenekler bulunur. Ruby için ruby-prof adlı birinin var olduğuna inanıyorum.
Ve yukarıda belirtildiği gibi, yakut için yürütme yığınına bakabilirsiniz. Bu yürütme yığını, geri izleme konum nesneleri içeren bir dizidir.
Bu komut hakkında bilmeniz gereken tek şey şu:
arayan (başlangıç = 1, uzunluk = nil) → dizi veya nil