gpt4 book ai didi

ruby - 是否有一种直接的包罗万象的方法来记录在 Ruby 中的对象上调用的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:03 24 4
gpt4 key购买 nike

有没有一种快速的方法来跟踪在对象上调用的方法?通常,当我在 gem 的公共(public)界面之下的级别上工作时,我会遇到难以追踪的错误。最终,我最终通过源代码跟踪对象并将所有内容都记在脑海中。

但是,如果能够在对象上调用类似 #log_method_calls 的东西,那么,比如说,调用它的所有方法都会打印到 stdout 或其他东西。有什么办法可以做到这一点?

最佳答案

有几种方法可以做到这一点,视情况而定。

如果可以创建一个新对象而不是被观察对象,您可以使用 method_missing 轻松编写一个观察者类。

class LogProxy  
def initialize obj
@obj = obj
end

def method_missing(name, *args)
puts "#{name} => #{args.to_s}"
@desk.send(name, *args)
end
end

如果不可能,您仍然可以使用 alias_method。这有点棘手,但使用 Module.instance_methods你可以链接任何东西的每一个方法。

类似于:

module Logger

def self.included(mod)
mod.instance_methods.each do |m|
next if m =~ /with_logging/
next if m =~ /without_logging/

mod.class_eval do

define_method "#{m}_with_logging" do |*args|
puts "#{m} called #{args.to_s}"
self.send_without_logging "#{m}_without_logging", *args
end

alias_method "#{m}_without_logging", m
alias_method m, "#{m}_with_logging"
end

end
end

end

TargetClass.send(:include, Logger)

关于ruby - 是否有一种直接的包罗万象的方法来记录在 Ruby 中的对象上调用的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6400038/

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