【发布时间】:2013-04-09 21:51:15
【问题描述】:
我有一个方法需要在附加的块上做一些巫术。这种块的样本可能是
myMethod do
somemethod x
someother y
def name(a,b)
a+b
end
end
前两个方法调用(somemethod x 和someother y)应该正常执行。但是,我想在不实际定义新方法的情况下截取方法定义(作为 S 表达式)。如果我将整个块转换为 S 表达式然后搜索 AST,我可以做到这一点。但是,我需要弄清楚如何调用这些方法。任何一个的解决方案都可以。要么是
- 截取定义,转换为S-expression(Ruby2Ruby可以理解)
- 将块转换为 S 表达式并找到方法调用并执行这些
编辑 我正在寻找的 AST 类似于
[:defn,
:name,
[:args,:a,:b],
[:call,
[lvar,:a],
:+
[lvar,:b]]]
【问题讨论】:
-
你能多说一些关于需求的事情吗?
name你想要什么? -
@RubyLovely 我已经更新了一个示例
-
看来
Module#method_added回调可能会让你为所欲为。 -
@dbenhur 据我从文档中可以看出,在添加方法后调用回调。这可能会通过 undefine/remove 解决,但是名称冲突将是一个问题,并且处理会提高复杂性,并且 method_add 仅提供方法的名称,因此我必须挖掘方法的实现(这似乎不过要容易)
-
是的,这就是为什么我只提供指针而不提供答案的原因。看起来钩子可以让你抓住定义然后使用 ruby2ruby 的 AST 工具包来修改和替换方法。回调确实在任何有机会调用该方法之前执行。
标签: ruby metaprogramming