Ruby에서 메소드 내에서 호출 메소드 이름을 찾는 방법이 있습니까?
예를 들면 다음과 같습니다.
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]
답변
Ruby 2.0.0에서는 다음을 사용할 수 있습니다.
caller_locations(1,1)[0].label
그것은이다 훨씬 빠른 루비 1.8 이상 솔루션보다 :
caller[0][/`([^']*)'/, 1]
backports
내가 시간 (또는 풀 요청!)을 얻을 때 포함됩니다 .
답변
사용 caller_locations(1,1)[0].label
(루비> = 2.0)
편집 : 내 대답에 사용 __method__
하려고했지만 잘못되었습니다. 현재 메서드 이름을 반환합니다.
답변
나는 사용한다
caller[0][/`([^']*)'/, 1]
답변
어때요?
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
답변
루비, 자바 또는 파이썬이든, 어떤 언어로든 발신자 및 수신자 정보를 보려면 항상 스택 추적을보고 싶을 것입니다. Rust 및 C ++와 같은 일부 언어에는 런타임 중에 볼 수있는 일종의 프로파일 링 메커니즘을 설정하기 위해 컴파일러에 내장 된 옵션이 있습니다. 나는 ruby-prof라는 루비가 존재한다고 믿습니다.
위에서 언급했듯이 루비의 실행 스택을 살펴볼 수 있습니다. 이 실행 스택은 역 추적 위치 객체를 포함하는 배열입니다.
기본적으로이 명령에 대해 알아야 할 것은 다음과 같습니다.
발신자 (시작 = 1, 길이 = 없음) → 배열 또는 없음