首页 > 解决方案 > 如何获取 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

标签: rubymodulemetaprogramming

解决方案


您可以像这样使用Module#prependandModule#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

警告:这只会显示提供的参数,不会在方法签名中输出默认参数


推荐阅读