有谁能提供关于monkeypatching/HookingRuby';s字符串#{}用于插值?

有谁能提供关于monkeypatching/HookingRuby';s字符串#{}用于插值?,c,ruby,C,Ruby,我正在研究monkeypatching Ruby语言的一些核心组件(我知道,我知道,monkeypatching很糟糕)-我特别需要做的是连接到: “#{some_variable}” 我的天真方法是使用whitequark解析器gem解析AST&将所有#{}重写为concats(这确实有效),但我不喜欢此路由的一些要求(通过猴子修补许多其他东西来加载每个文件[问题列表继续]) 我深入研究了ruby C代码,但找不到实际执行插值的函数。有人能帮我确定该行为的定义在哪里/如何定义吗 编辑: 我正努

我正在研究monkeypatching Ruby语言的一些核心组件(我知道,我知道,monkeypatching很糟糕)-我特别需要做的是连接到:

“#{some_variable}”

我的天真方法是使用whitequark解析器gem解析AST&将所有#{}重写为concats(这确实有效),但我不喜欢此路由的一些要求(通过猴子修补许多其他东西来加载每个文件[问题列表继续])

我深入研究了ruby C代码,但找不到实际执行插值的函数。有人能帮我确定该行为的定义在哪里/如何定义吗

编辑: 我正努力实现的目标,正如你所能做到的:

class String
  alias_method :my_+, :+
  def +(other)
    puts 'patched'
    self.my_+(other)
  end
end
a = "a"
a + "b" => #would output patched
我想要一种类似的方法来修补{}-但是,这不能通过普通的monkeypatching来完成-我正在寻找关于如何在不重写VM中每个类的AST的情况下实现这一点的一般指导。

“str1{funcall}str2”
在Ruby中执行以下操作:

== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,24)>=================
0000 putobject        "str1 "                                         (   1)[Li]
0002 putself
0003 opt_send_without_block <callinfo!mid:funcall, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache>
0006 dup
0007 branchiftype     T_STRING, 15
0010 dup
0011 opt_send_without_block <callinfo!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>, <callcache>
0014 tostring
0015 putobject        " str2"
0017 concatstrings    3
0019 leave
==disasm:#=================
对象“str1”(1)[Li]
0002普赛尔夫
0003 opt_send_无_块,
0006 dup
0007 BranchShift类型T_字符串,15
0010 dup
0011选择发送不带块,
0014 tostring
0015 putobject“str2”
0017混凝土串3
0019请假
有很多操作(如果不是字符串,则将{}内容转换为字符串),最后使用concatstrings命令完成,该命令如下所示:call
rb#u str_append


换句话说,你不能用Ruby来蒙骗补丁/钩子{},但正如cremno所建议的那样,你应该研究C部分,通过用你自己的钩子重新编译Ruby来覆盖{}的默认行为。

可以是
compile.C
,也可以是
insns.def
。你想做什么还不清楚。