2015-09-03 71 views
0

的默認值我有一個看起來像這樣的方法:獲得命名或可選參數

class A 
    def my_method(a: 'key value', b = 'opt value') 
    # ... 
    end 
end 

使用反射,我能得到的參數名這樣的:

A.new.method(:my_method).parameters 
# => [[:key, :a], [:opt, :b]] 

我怎樣才能獲取這些參數的默認值而不調用my_method

+0

看起來這可以使用Merb的action-args庫來完成。看看這個答案,看看它是否得到你想要的東西?正如Antti所建議的,我會選櫻桃,從Merb的源代碼中挑選你想要的。 http://stackoverflow.com/a/625222/227397 –

+0

只是一個挑剔,但我認爲可選參數需要首先在參數列表中,所以'my_method(b ='opt',a:'鍵')' – Anthony

+1

爲什麼你想這樣做嗎?你想達到什麼目的? – spickermann

回答

2

這是不可能的。我現在找不到線索,但是matz明確表示這是設計。問題是默認值是一個任意表達式,並且由於Ruby中的所有內容都是表達式,所以它可以是任何東西。

例如,你看這個:

def foo(bar = if rand < 0.5 then Time.now else rand end) 

將您提出的方法返回的是什麼?

基本上,你有兩個選擇:

  • 評估默認值表達式。這意味着您將獲得的一些價值,但這並不能告訴您有關真實表達的內容。
  • 不要通過將其打包在Proc中來評估默認值表達式。但是沒有辦法讓表達再次脫離Proc

所以,無論如何,你實際上並沒有得到任何有用的信息。

+0

感謝您的好解釋。 – Max