gpt4 book ai didi

ruby - 在运行时将一行代码注入(inject)现有方法

转载 作者:行者123 更新时间:2023-12-05 02:48:20 24 4
gpt4 key购买 nike

在运行时,我想在 - # <-- Injection point 处注入(inject)一行代码

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存在但想动态注入(inject)他们建议的代码。

我已经有了可以从 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

问题是红色的

co

最佳答案

The reason I need this is so that I can use the Ruby Tracepoint Class to extract some run time information about the method signature.

Specifically the default parameter values in b = 1 and d: 1

TracePoint 允许您在不修补方法的情况下获取信息。您只需设置一个 :call Hook ,然后调用该方法:

TracePoint.trace(:call) do |tp|
tp.parameters.each do |type, name|
value = tp.binding.local_variable_get(name)
puts format('%8s: %s = %s', type, name, value.inspect)
end
end

A.new.some_method(123)

输出:(省略方法的输出)

     req: a = 123
opt: b = 1
rest: c = []
key: d = 1
keyrest: e = {}

关于ruby - 在运行时将一行代码注入(inject)现有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64554864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com