簡體   English   中英

如何獲取Ruby中使用的方法的列表?

[英]How to get a list of used methods in 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#prependModule#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

注意:僅顯示提供的參數,不會在方法簽名中輸出默認參數

ruby核心庫包括TracePoint類,該類可用於跟蹤幾乎所有內容-從已定義或調用的方法,或引發的異常,...

這是一個示例用法,它將執行所需的跟蹤:

class A
  def add(a, b)
    a + b
  end

  def sub(a, b)
    a - b
  end
end

TracePoint.trace(:call, :return) do |tp|
  next unless tp.defined_class == A
  case tp.event
  when :call
    params = tp.parameters.map { |arg| eval(arg[1].to_s, tp.binding) }
    puts "Method #{tp.method_id}(#{params.join(', ')}) called"
  when :return
    puts "return value #{tp.return_value}"
  end
end

# The trace has been enabled! Any time one of those events occurs, the block is evaluated.
a = A.new
a.add(2,1)
a.sub(2,1)

輸出:

方法add(2,1)被調用

返回值3

方法sub(2,1)調用

返回值1

如您所見,獲取params數據有些麻煩。 TracePoint可以訪問方法簽名 ,但是您需要利用跟蹤的綁定來查看實際使用的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM