将方法名作为字符串传递给Ruby中不同类的其他方法?
我有val1.rb和val2.rb,它们分别有名为将方法名作为字符串传递给Ruby中不同类的其他方法?,ruby,methods,function-pointers,Ruby,Methods,Function Pointers,我有val1.rb和val2.rb,它们分别有名为foo1和foo2的方法,一个名为startup.rb的启动脚本和一个名为core.rb的主脚本 启动脚本从core.rb创建类的对象main_obj,并分别创建val1和val2类的对象obj1和obj2 Core希望调用一个它接受作为参数的方法 下面是我编写的代码,但它抛出一个错误,称为未定义的方法“foo1” # #### foo1.rb #### # class Test1 def foo1(par1) puts "par1 is
foo1
和foo2
的方法,一个名为startup.rb的启动脚本和一个名为core.rb的主脚本
启动脚本从core.rb创建类的对象main_obj
,并分别创建val1
和val2
类的对象obj1
和obj2
Core希望调用一个它接受作为参数的方法
下面是我编写的代码,但它抛出一个错误,称为未定义的方法“foo1”
# #### foo1.rb #### #
class Test1
def foo1(par1)
puts "par1 is :#{par1}"
end
end
# #### core.rb #### #
class Core
def main_test (validation_obj, validation_method)
par1 = 'sample'
validation_obj.send :validation_method, par1
# other way #
# validation_method.call(par1)
end
end
# #### startup.rb #### #
require_relative 'core'
require_relative 'foo1'
require_realtive 'foo2'
main_obj = Core.new
testobj_1 = Test1.new
testobj_2 = Test2.new
method_name = 'foo1' # ==> want to pass this method as string
main_obj.main_test(testobj_1, method_name)
method_name = 'foo2'
main_obj.main_test(testobj_2, method_name)
非常感谢您的帮助 我认为您需要将字符串转换为符号
"foo".to_sym
以及您的代码:
class Core
def main_test (validation_obj, validation_method)
par1 = 'sample'
validation_obj.send validation_method.to_sym, par1
# other way #
# validation_method.call(par1)
end
end
我相信这将使您的代码正常工作。您的问题实际上与要处理的文件数无关。您可以通过定义将要使用的类来简化。你还需要更清楚地了解你所问的问题。您会说,“核心希望调用一个方法…”。什么是核心?您已经提到了一个文件“core.rb”和一个类
core
。给你所说的方法一个名称、类和参数,并说出你希望该方法返回的内容。举个具体的例子会很有帮助。另外,main\u test.new
意味着main\u test
是一个类,它不是。只需将:validation\u method
更改为validation\u method
您在编写:validation\u method
时正在创建一个符号
,它正试图调用一个名为validation\u method
的方法。不要创建这个符号,只需传递参数即可validation\u obj.send validation\u method,par1
@engineersmnky,感谢您的输入。最初,我只是尝试通过“验证方法”。然而,它给我带来了相同的未定义方法错误,使我将字符串更改为symbol(我相信使用“:”是我转换为symbol的错误方法)!执行@engineersmnky的建议,并执行Test1#foo1
。考虑到您没有类Test2
,执行Test2#foo2
将更加困难@CarySwoveland和所有人,我为我的问题含糊不清表示诚挚的歉意。我编辑了错误的代码部分。#send
处理字符串
问题在于他创建的符号没有引用变量。当他编写:validation\u method
时,它没有引用validation\u method
参数,而是传递该符号。True。我看到了。这个问题也是如此令人困惑。很难理解他到底想要什么。安德烈,我同意,但当问题像这里这样含糊不清时,我建议你在回答之前在评论中寻求澄清。安德烈,卡里,工程师斯姆基,感谢你的意见。我接受了解决我的问题的答案。