programing

호출 방법의 이름을 가져오는 방법은 무엇입니까?

projobs 2023. 6. 3. 09:41
반응형

호출 방법의 이름을 가져오는 방법은 무엇입니까?

루비에서 메소드 내부의 호출 메소드 이름을 찾을 수 있는 방법이 있습니까?

예:

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.rbRubocop의 제안에 따라 다시 작성되었습니다.

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

반응형