2012-09-30 100 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可能被使用,但我不知道如何區分上面定義的其他局部變量的參數。是否有針對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該方法的第一件事,即在設置任何局部變量之前,並保存結果供以後使用。

1

大概最容易做的事情會是這樣的:

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

,或者相反:

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

我不知道你爲什麼反對至少一次在提參數名。在你的方法中分配你的「參數」(讓保留整個數組)或者從解析的參數中重建數組是最直接和最易讀的。

+0

我不反對使用參數名稱。我只是反對使用它,當我調用'return_arguments'。 – sawa