다른 메소드 내에서 주어진 반환의 원래 클래스/메소드/등을 결정할 수 있기를 바랄뿐입니다. 예컨대 :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를 샅샅이 뒤지고 공중/개인 방법으로 노는 것은 지금까지 도움이되지 않았다. 가능하면 누구나 알 수 있습니까?
문제를 찾아 주셔서 감사합니다. 위의 예에 대한 조언을 사용하십시오. 'pry (main)> args.send : caller => [ "test.rb : 23 : 'printit'", "test.rb : 26 : in ''" ]' –
'caller_locations'을 사용한 동일한 출력. 클래스와 메소드가 외부 클래스와 메소드가 사용될 때이 특정 트레이스를 통해 클래스/메소드가'args '로 전달되도록하는 방법이 보이지 않습니다. –
죄송합니다. 지금은 ... 당신이 맞다는 것을 이해합니다. 호출자는 생성 된 값이 메소드에 전달되기 전에 인수가 평가되기 때문에 도움이되지 않습니다. 대신에 블록이나 람다를 전달하여 메서드 내부까지 평가가 지연 될 수 있지만 그 블록이나 람다의 Ruby 바이트 코드를 검사하지 않으면 여전히 도움이되지 않습니다. –