在Ruby中method_missing陷阱
metaprogramming (4)
如果您可以预测方法名称,则最好动态声明它们,而不是依赖method_missing,因为method_missing会导致性能损失。 例如,假设您想要扩展数据库句柄,以便能够使用以下语法访问数据库视图:
selected_view_rows = @dbh.viewname( :column => value, ... )
您可以提前确定数据库中的所有视图,然后遍历它们以在@dbh上创建“viewname”方法,而不是依赖于数据库句柄的method_missing并将方法名称分配给数据库作为视图的名称。
https://src-bin.com
在Ruby中定义method_missing
方法时有什么要注意的吗? 我想知道是否有一些从继承,异常抛出,性能或其他任何不太明显的交互。
Answer #1
如果您的方法缺失方法只是寻找某些方法的名称,不要忘记调用超级,如果你没有找到你要找的东西,所以其他方法的失误可以做他们的事情。
Answer #2
另一个难题:
method_missing
在obj.call_method
和obj.send(:call_method)
之间的行为不同。 基本上,前者不包含所有私有和未定义的方法,而后者不会错过私有方法。
所以当有人通过send
调用你的私有方法时,你的method_missing
将永远不会陷入通话。