2013-02-20 98 views
1

我有一類具有一些方法如何使用通過參數傳遞的名稱調用方法?

class Test 
    def add(a,b) 
    a+b 
    end 
    ... 
end 

我想測試,動態地,如果一類和方法被定義,並且置方法。 這裏是代碼和問題=(

def methodInsideDefined?(className, methodName, param1, param2, result) 
    if(className.is_a?(Class) && className.method_defined?(:methodName)) 
    className.new.methodName(param1,param2).eql?(result) 
    end 
end 

所以,如果我打電話:

methodInsideDefined?(Test, add, 1, 2, 3) 

我應該得到一個真正的價值,但我得到一個:

NameError: undefined local variable or method ‘add’ for main:Object  

請以靜態方式忽略參數編號,稍後我將獲取動態參數編號,但如果您有一個具有動態編號參數的解決方案,請告訴我。= D

是的,我是一個紅寶石noobie。

回答

1

嘗試:

methodInsideDefined?(Test, :add, 1, 2, 3) 

在你當前的代碼要傳遞子虛烏有變量add給你的函數。如果不是變量,而是將符號:add傳遞給該函數,它會起作用。

在你的函數定義中是相反的。你正在使用符號而不是變量。它應該是:

def methodInsideDefined?(className, methodName, param1, param2, result) 
    if className.is_a?(Class) && className.method_defined?(methodName) 
    className.new.send(methodName,param1,param2).eql?(result) 
    end 
end 

還要注意在我的代碼使用send。當你想動態地調用一個方法時,你必須使用它。

+0

太簡單了!非常感謝你@Mischa,我在裏面使用了這個符號,因爲我正在和Pry一起測試,它需要符號,'send'是這裏的關鍵。工作得很好。我現在嘗試一個動態參數的解決方案。再次感謝。 – 2013-02-20 15:33:09

相關問題