2012-09-30 2 views
0

다른 메서드 내에서 메서드를 사용하려면 다음에서 return_arguments과 같은 인수 이름을 언급 할 필요없이 인수를 반환합니다.어떻게 인수에 액세스 할 수 있습니까?

def foo a, b, *c 
    ... # part a 
    p return_arguments 
    ... # part b 
end 

foo(1, "blah blah", :a, :b) 
... # return from part a 
# => [1, "blah blah", :a, :b] 
... # return from part b 

이것이 가능합니까? binding, local_variableseval을 사용할 수 있지만 위의 part a에 정의 된 다른 로컬 변수와 인수를 구별하는 방법을 모르겠습니다. local_variables에 대한 주문 규칙이 있습니까? 그렇다면 arity과 함께 사용하여 인수를 추출 할 수 있습니다.

+0

이 일을하는 것은 매우 독특한 종류의입니다. 명명 된 인수를 사용하여 해시를 전달하는 것이 더 나을 것입니다. – tadman

답변

1

그것은 확실히 비효율적이지만, 여기에 (당신은 아마 언급 @tadman 같은 해시 사용해야하지만) 솔루션입니다 :

set_trace_func proc { |e,_,_,i,b,_| 
    if e == 'call' 
     p = method(i).parameters 
     @arguments = p.map {|p| eval(p[1].to_s,b)} 
    end 
} 

def foo a, b, *c 
    a = 50 
    b = 3 
    return @arguments 
    a = 11 
    b = 2 
end 

p foo(1, "blah blah", :a, :b) 
1

메소드에서 먼저 local_variables을 사용하십시오. 즉, 로컬 변수를 설정하기 전에 사용하고 나중에 사용하기 위해 결과를 저장하십시오. 반대로

def foo(*args) 
    a, b, *c = *args 
    # (...) 
    p args 
    # (...) 
end 

을 또는 :

def foo(a, b, *c) 
    args = [a, b, *c] 
    # (...) 
    p args 
    # (...) 
end 

잘 모르겠어요 당신이 적어도 한 번에 인수 이름을 언급에 반대하는 이유

1

아마 할 수있는 가장 쉬운 방법은 다음과 같이 될 것이다 . 메서드 내에서 "인수"를 할당하거나 (전체 배열 유지) 구문 분석 된 인수에서 배열을 재구성하는 것이 가장 간단하고 읽기 쉽습니다.

+0

나는 인수 이름을 사용하는 것에 전혀 반대하지 않습니다. 나는'return_arguments'를 호출 할 때 그것을 사용하는 것에 반대하고 있습니다. – sawa