호출 방법의 이름을 가져오는 방법은 무엇입니까?
루비에서 메소드 내부의 호출 메소드 이름을 찾을 수 있는 방법이 있습니까?
예:
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
Ruby 1.8+ 솔루션보다 훨씬 빠릅니다.
caller[0][/`([^']*)'/, 1]
에 포함됩니다.backports
시간이 나면(또는 당김 요청!).
사용하다caller_locations(1,1)[0].label
(Ruby >= 2.0의 경우)
편집: 제 대답은 사용하라는 것이었습니다.__method__
하지만 제가 틀렸습니다. 현재 메소드 이름이 반환됩니다.
사용합니다
caller[0][/`([^']*)'/, 1]
어때.
caller[0].split("`").pop.gsub("'", "")
훨씬 깨끗한 이모.
대신 라이브러리 기능으로 작성하고 필요한 곳이면 어디든 전화를 걸 수 있습니다.코드는 다음과 같습니다.
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++와 같은 일부 언어에는 실행 시간 동안 볼 수 있는 일종의 프로파일링 메커니즘을 켜기 위한 옵션이 컴파일러에 내장되어 있습니다.저는 루비를 위해 루비 프로파일이라는 것이 존재한다고 믿습니다.
그리고 위에서 언급했듯이, 당신은 실행 스택에서 루비를 조사할 수 있습니다.이 실행 스택은 역추적 위치 개체를 포함하는 배열입니다.
기본적으로 이 명령에 대해 알아야 할 사항은 다음과 같습니다.
호출자(시작=1, 길이=숫자) → 배열 또는 0
@amitkarsale의 답은 효과가 있지만,private
모듈은 인스턴스화되지 않으므로 에서는 모듈에서 아무것도 수행하지 않습니다.여기 있습니다call_chain.rb
Rubocop의 제안에 따라 다시 작성되었습니다.
module CallChain
def self.caller_method(depth = 1)
parse_caller(caller(depth + 1).first).last
end
def self.parse_caller(at)
return unless /^(.+?):(\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
if __FILE__ == $PROGRAM_NAME
caller = CallChain.caller_method
puts caller
end
언급URL : https://stackoverflow.com/questions/5100299/how-to-get-the-name-of-the-calling-method
'programing' 카테고리의 다른 글
.NET 5 WPF 프로그램에서 경고 NETSDK1137을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.03 |
---|---|
Windows 명령줄에서 파일/폴더 이름으로 사용하기에 적합한 형식으로 현재 날짜/시간을 가져오려면 어떻게 해야 합니까? (0) | 2023.06.03 |
정의된 확대/축소 수준에서 모든 Excel 시트 설정 (0) | 2023.06.03 |
CSMutableArray에 CGRect 값을 저장하는 방법은 무엇입니까? (0) | 2023.06.03 |
xip 파일에서 Xcode를 설치하는 방법 (0) | 2023.06.03 |