2016-06-12 2 views
0

다른 메소드 내에서 주어진 반환의 원래 클래스/메소드/등을 결정할 수 있기를 바랄뿐입니다. 예컨대 :Ruby - 반환의 실행 추적/원점 확인

# Ruby 

class Stringify 
    def fancy(words) 
    return ">> #{words}" 
    end 

    def boring(words) 
    return "- #{words}" 
    end 
end 

class Yarnify 
    def fancy(words) 
    return ">> #{words}" 
    end 

    def boring(words) 
    return "- #{words}" 
    end 
end 

def printit(*args) 
    puts args 
end 

printit(Yarnify.new.boring("Hello")) 
printit(Stringify.new.fancy("Hey")) 
printit(Stringify.new.boring("Hi")) 
printit(Yarnify.new.fancy("Heyo")) 

# Output: 
"- Hello" 
">> Hey" 
"- Hi" 
">> Heyo" 

예를 들면 :

## Desired trace 
def printit(*args) 
    puts args 
    puts "Originated from #{args.what_called.method} within #{args.what_called.class}." 
end 

printit(Yarnify.new.fancy("This is a return!")) 

## Output 
">> This is a return!" 
"Originated from fancy within Yarnify." 

args의 내용은 그것이 printit 메소드로 전달되기 전에 실행 것으로 보인다. 그러나 나는 똑같이 보이는 여러 입력을 동적으로 섞어서 args의 소스 클래스/메서드를 기록해야하는 유스 케이스가 있습니다. args에 rubydocs를 샅샅이 뒤지고 공중/개인 방법으로 노는 것은 지금까지 도움이되지 않았다. 가능하면 누구나 알 수 있습니까?

답변

0

caller 무엇을 찾고 계십니까?

#!/usr/bin/env ruby 

require 'awesome_print' 

def foo 
    bar 
end 


def bar 
    baz 
end 


def baz 
    ap caller 
end 


foo 

=begin 
Outputs: 

[ 
    [0] "./caller.rb:11:in `bar'", 
    [1] "./caller.rb:6:in `foo'", 
    [2] "./caller.rb:20:in `<main>'" 
] 
=end 

또는 스레드의 배열을 반환하는 caller_locations 방법 : 역 추적이 :: 위치 객체 (http://ruby-doc.org/core-2.3.1/Thread/Backtrace/Location.html 참조)가있다 : 그것은 스택 추적이 포함되어 있습니다. 스택 추적 항목의 구성 요소 (예 : 레이블)를 얻을 수 있기 때문에 더 많은 제어권을 얻을 수 있습니다.

+0

문제를 찾아 주셔서 감사합니다. 위의 예에 대한 조언을 사용하십시오. 'pry (main)> args.send : caller => [ "test.rb : 23 : 'printit'", "test.rb : 26 : in '

'" ]' –

+0

'caller_locations'을 사용한 동일한 출력. 클래스와 메소드가 외부 클래스와 메소드가 사용될 때이 특정 트레이스를 통해 클래스/메소드가'args '로 전달되도록하는 방법이 보이지 않습니다. –

+0

죄송합니다. 지금은 ... 당신이 맞다는 것을 이해합니다. 호출자는 생성 된 값이 메소드에 전달되기 전에 인수가 평가되기 때문에 도움이되지 않습니다. 대신에 블록이나 람다를 전달하여 메서드 내부까지 평가가 지연 될 수 있지만 그 블록이나 람다의 Ruby 바이트 코드를 검사하지 않으면 여전히 도움이되지 않습니다. –