使用Ruby中的函数名称从string中调用函数

我怎么能做他们在这里谈论的,但在Ruby?

你将如何做一个对象的function? 以及你将如何做一个全球性的function(见jetxee在提到的职位上的答案 )?

示例代码:

event_name = "load" def load() puts "load() function was executed." end def row_changed() puts "row_changed() function was executed." end #something here to see that event_name = "load" and run load() 

更新:你如何得到全球的方法? 或我的全球function?

我尝试了这个额外的路线

 puts methods 

和load和row_change哪里没有列出。

直接在对象上调用函数

 a = [2, 2, 3] a.send("length") 

如预期的那样返回3

或用于模块function

 FileUtils.send('pwd') 

和一个本地定义的方法

 def load() puts "load() function was executed." end send('load') 

用这个:

 > a = "my_string" > meth = a.method("size") > meth.call() # call the size method => 9 

很简单,对吧?

至于全球 ,我认为Ruby的方式将是使用methods方法来search它。

三种方式: send / call / eval – 及其基准

典型的调用(供参考):

 s= "hi man" s.length #=> 6 

使用send

 s.send(:length) #=> 6 

使用call

 method_object = s.method(:length) p method_object.call #=> 6 

使用eval

 eval "s.length" #=> 6 

基准

 require "benchmark" test = "hi man" m = test.method(:length) n = 100000 Benchmark.bmbm {|x| x.report("call") { n.times { m.call } } x.report("send") { n.times { test.send(:length) } } x.report("eval") { n.times { eval "test.length" } } } 

…正如你所看到的,实例化一个方法对象是调用方法中最快速的dynamic方法,同时也注意到使用eval的速度有多慢。

 ####################################### ##### The results ####################################### #Rehearsal ---------------------------------------- #call 0.050000 0.020000 0.070000 ( 0.077915) #send 0.080000 0.000000 0.080000 ( 0.086071) #eval 0.360000 0.040000 0.400000 ( 0.405647) #------------------------------- total: 0.550000sec # user system total real #call 0.050000 0.020000 0.070000 ( 0.072041) #send 0.070000 0.000000 0.070000 ( 0.077674) #eval 0.370000 0.020000 0.390000 ( 0.399442) 

感谢这篇博客文章 ,详细介绍了这三种方法,并展示了如何检查这些方法是否存在。

就个人而言,我会设置一个散列函数引用,然后使用该string作为散列的索引。 然后你用参数调用函数引用。 这样做的好处是不允许错误的string调用你不想调用的东西。 另一种方法是基本evalstring。 不要这样做。

PS不要懒惰,实际上输出你的整个问题,而不是链接到某个东西。