ruby - 如何获取 Ruby 中使用的方法列表?
问题描述
嘿,我希望我的方法 logify 将每个方法及其参数和我的类 A 的返回值放在一起。例如,我编写了一个简单的类 A,其中包含两个方法 add 和 sub,输出应该如下所示:
Output:
Method add(1, 2) called
return value 3
Method sub(1, 2) called
return value -1
我知道我可以使用每种方法,self.instance_methods(false)
但有人可以进一步帮助我吗?
require_relative "log"
class A
extend Log
def add(a, b)
a + b
end
def sub(a, b)
a - b
end
logify
end
a = A.new
a.add(2,1)
a.sub(2,1)
module Log
def logify
puts self.instance_methods(false)
end
end
解决方案
您可以像这样使用Module#prepend
andModule#prepended
来帮助解决这个问题:
module Log
def self.prepended(base)
base.instance_methods(false).each do |m|
define_method(m) do |*args, &block|
puts "Method #{m}(#{args.join(',')}) called"
val = super(*args, &block)
puts "return value #{val}"
val
end
end
end
end
class A
def add(a, b)
a + b
end
def sub(a, b)
a - b
end
end
A.prepend(Log)
它的作用是在前置模块中定义一个与原始模块同名的方法,然后构建您的输出并在中间 ( super
) 中将原始方法删除以获取返回值。
例子
a = A.new
a.add(2,1)
# Method add(2,1) called
# return value 3
#=> 3
a.sub(2,1)
# Method sub(2,1) called
# return value 1
#=> 1
警告:这只会显示提供的参数,不会在方法签名中输出默认参数
推荐阅读
- mongodb - 无法访问 MongoDB 属性或函数
- css - 如何摆脱css中的水平滚动条
- xml - 如何从 XML 字符串中删除 XML 意图。?
- reactjs - 在 Go 中从 Back 发送 Cookie,这是一个 api 休息,使用 React JS 发送到前端
- c# - 是否可以修改内存中的内容?
- android - 颤振:ListWheelScrollView 放大镜不起作用
- java - 在基于 Spring Boot 的应用程序中使用 REST API 输入在运行时设置模式名称
- java - 加入两个数据帧,限制一个数据帧的行
- c++ - ESP8266,Twilio 不发送短信
- cmake - MinGW64 下 g++ 的 "-x c++" 标志导致 "stray [...] in program" 错误