使用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调用你不想调用的东西。 另一种方法是基本eval
string。 不要这样做。
PS不要懒惰,实际上输出你的整个问题,而不是链接到某个东西。