【发布时间】:2020-10-27 12:53:17
【问题描述】:
在运行时,我想在 -# <-- Injection point 处注入一行代码
class A
def some_method(a, b = 1, *c, d: 1, **e)
# <-- Injection point
# Code that does stuff
puts a
puts b
puts c
puts d
puts e
end
end
我需要这个的原因是我可以使用Ruby Tracepoint Class 来提取有关方法签名的一些运行时信息。
具体是b = 1和d: 1中的默认参数值
我查看了这个问题Inspect the default value for optional parameter in ruby's method?,其中存在有用的answer,但想动态注入他们建议的代码。
我已经有可以从 ruby 类中提取方法签名的现有代码。
示例
给定这个类,它定义了许多使用各种参数化签名的方法。
class A
def d; end
def e(a); end
def f(a, b = 1); end
def g(a, b = 1, c = 2); end
def h(*a); end
def i(a, b, *c); end
def j(**a); end
def k(a, *b, **c); end
def l(a, *b, **c, &d); end
def m(a:); end
def n(a:, b: 1); end
def p?; end
def z(a, b = 1, *c, d: 1, **e); end
end
我可以运行以下代码来提取签名信息。不幸的是,它无法解析default 参数或命名值。
class_definition = MethodSignatures.new(A.new)
class_definition.print
问题是红色的
【问题讨论】:
-
你能在模块中定义这些方法吗?如果是这样,那么您也可以简单地在您的类中重新定义它们,并且您可以对它们调用 super 以便您可以:(i)添加注入,然后保留方法在模型中执行的功能。或者,您可以重命名这些方法然后添加注入吗?
标签: ruby