【发布时间】:2012-04-06 03:07:59
【问题描述】:
我不确定这在 Ruby 中是否可行,但万一有人知道一个好的解决方案。
我想更改块的结构,将其中的特定节点替换为其他代码结构。很像宏。
例如,假设我有一个未评估的代码块
some_method do
foo
bar
end
然后我定义 some_method 之类的
def some_method(&block)
...
end
在 some_method 中,我真的很想用其他东西替换块中的“bar”,例如与 baz。
我想在不评估块的情况下进行替换,因为最终我将块传递到其他地方。
可行吗?还是没有?
我能想到相当复杂的答案:例如我可以使用定义替换 bar 的附加闭包来传递块,并在评估 bar 时使用 method_missing 和 continuation 将 bar 替换为 baz。但是有没有更简单的方法?
谢谢。
【问题讨论】:
-
我希望你有一个很好的理由这样做,而不是简单地给
bar打补丁来做你想做的事。从外部开发人员的角度来看,这种繁重的元编程可能会导致您的应用程序表现得非常不可预测。 -
@tadman:猴子补丁对外部开发人员友好吗?我意识到它超出了规范,但是一旦更改了块,它就与任何其他 ruby 代码块没有什么不同,所以实际上它被很好地抽象了。宏是有用的概念。
-
您阅读过Macros, Hygiene, and Call By Name in Ruby 并查看过Reg 的rewrite 和ick gems 吗?我认为它们不适用于 1.9,因为依赖于 1.8 ast 解释器中的 sexp/parse-tree。但是一些非常有趣的工作将 ruby 转变为更强大的 lisp 和更强大的函数式语言。
标签: ruby macros metaprogramming