2013-02-20 93 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

相关问题