[ruby] 호출 방법의 이름을 얻는 방법?

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, 길이 = 없음) → 배열 또는 없음