9

이의 내가 발동/람다/블록/방법이 있다고 가정 해 봅시다/등 같은 : 나는 매개 변수의 이름을 찾을 수 있습니다 알고루비 : 옵션 PROC 인수의 기본값을받는 방법

2.1.2 :075 > procedure = Proc.new { |a, b=2, *c, &d| 42 } 
=> #<Proc:[email protected](irb):75> 

로 :

2.1.2 :080 > procedure.parameters 
=> [[:opt, :a], [:opt, :b], [:rest, :c], [:block, :d]] 

하지만 그것은 하지 주어진다면 주어진 선택적 매개 변수 가정 것이다 값을 가져 가야합니까 어떻게?


PS : 예. 나는이 질문/대답 전에 here,하지만 이전 솔루션은 merb 보석의 사용을 필요로 실제로는 약간 오해의 소지가있다 알고있다. merb 그 자체가 질문에 답했을 때 그 기능을 제공 한 JRuby 나 MRI가 아닌 한 methopara 보석에 의존합니다. 슬프게도, 현재, 은 포기할 것 같다. 또한, 오직 루비 1.9 (그리고 최신 버전조차도 지원하지 않음), 그래서 현재 루비 버전에서 작동하는 솔루션을 찾고 있습니다.

+2

저는 이것이 거의 불가능하다고 생각합니다. 소위 말하는 '기본값'값은 모든 종류의 실행 코드 일 수 있습니다. 전화 할 때마다 실행됩니다. – hakcho

+0

@hakcho, 아주 잘 잡습니다. (나는이 계정을 완전히 잃어 버렸고, 게시 한 이래 완전히 다른 접근법을 사용했다.) 여전히 값 (또는 루틴이라면 루틴)에 프로그래밍 방식으로 액세스하는 것이 좋을 것이다. – mikev

답변

2

proc/lambda가 파일에 정의되어 있다고 가정하면 source_location 메서드를 사용하여 정의 된 파일의 위치와 줄 번호를 찾을 수 있습니다. 우리는 PROC을 통과 할 때/람다가 정의 된 소스 라인을 뱉어 수있는 간단한 방법을 만들 수 있습니다 File.readlines에서 약간의 도움으로

2.2.0 (main):0 > OH_MY_PROC.source_location 
=> [ 
    [0] "sandbox/proc.rb", 
    [1] 1 
] 

. 당신이 조금 더 복잡하게 방법에 대해 동일한 작업을 수행하려면

def view_def proc_lambda 
    location = proc_lambda.source_location 
    File.readlines(location[0])[location[1]-1] 
end 

행동에서는이

2.2.0 (main):0 > view_def OH_MY_PROC 
=> "OH_MY_PROC = Proc.new { |a, b=2, *c, &d| 42 }\n" 
2.2.0 (main):0 > view_def OH_MY_LAMBDA 
=> "OH_MY_LAMBDA = ->(a, b=2, *c, &d) { 42 }\n" 

같이 보입니다. 이 경우 Pragmatic Studio 블로그에서이 블로그 게시물을 읽는 것이 좋습니다. "View Source" On Ruby Methods

+0

merb를 사용할 수도 있습니다. source_location은 예외를 구하고 텍스트 편집기에서 proc을 열 때 좋습니다. – Rivenfall

+0

@rivenfall 원래 게시물을 참조하십시오. Merb는 버려진 의존성으로 인해 옵션이 아닙니다. – mikev

+0

@brownmike 필자는 혼자서 소스 코드를 파싱하지 않고이 작업을 수행 할 방법을 찾고 있었지만 아이디어에 감사드립니다. 어쨌든 나는 다른 방식으로 갔다. – mikev