【发布时间】:2013-07-01 13:21:07
【问题描述】:
据我所知,在 Ruby 中动态调用方法有以下三种方式:
方法一:
s = SomeObject.new
method = s.method(:dynamic_method)
method.call
方法二:
s = SomeObject.new
s.send(:dynamic_method)
方法三:
s = SomeObject.new
eval "s.dynamic_method"
通过对它们进行基准测试,我确定方法 1 是迄今为止最快的,方法 2 较慢,而方法 3 是迄今为止最慢的。
我还发现.call 和.send 都允许调用私有方法,而eval 不允许。
所以我的问题是:有任何理由使用.send 或eval?为什么你不总是只使用最快的方法?这些调用动态方法的方法还有哪些不同?
【问题讨论】:
-
很好的建设性问题:) +1..
-
@Abraham +1 好问题!
-
您可能希望包含您的基准测试结果并修复方法 2 代码示例中的错字。
-
“我还发现 .call 和 .send 都允许调用私有方法,而 eval 不允许。” 你可以使用
.public_send而不是.send不允许调用私有方法。
标签: ruby metaprogramming dynamic-method