호출 방법의 이름을 얻는 방법? 이름을 찾는 방법이 있습니까? 예를 들면 다음과 같습니다. class

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