Ruby 调试:如何找出响应的方法或变量?

Ruby debugging: How to find out which method or variable is responding?

在调试 ruby 一些复杂的代码时,很容易被堆叠的方法定义弄糊涂,以及与局部变量的命名冲突。

我正在寻找一种快速的方法来找出哪个方法或变量响应表达式,比如 any_expression.identify.

到目前为止我能找到的最好的是:

method(:happy)
#=> #<Method: Object(Helper)#happy>

method(:happy).source_location
#=> ["/home/somebody/project/lib/helper.rb", 9]

不幸的是,局部变量(如 happy=42)将优先于其他方法,但 method(:happy) 仍将 return 其他方法。

有什么想法吗?

您不必使用 self.class.new 作为前缀。如果 class 没有不带参数的构造函数,它将无法工作。

local_variables.include?(:foo) # local variable
method(:foo)                   # method


另一种选择是使用 defined? 关键字:

foo = 42
def bar; end

defined?(foo) # => "local-variable"
defined?(bar) # => "method"

在撬中,可以使用show-method:

show-method bar # =>
  # From: (pry) @ line 104:
  # Owner: Object
  # Visibility: public
  # Number of lines: 1

  # def bar; end

ls

ls foo # =>
  # Comparable#methods: between?
  # Numeric#methods: 
  #   +@      conj       imaginary     pretty_print_cycle  rectangular           
  #   abs2    conjugate  nonzero?      quo                 remainder             
  #   angle   eql?       phase         real                singleton_method_added
  #   arg     i          polar         real?               step                  
  #   coerce  imag       pretty_print  rect                to_c                  
  # Integer#methods: 
  #   ceil         downto  gcdlcm    next       pred         times   to_r    
  #   chr          floor   integer?  numerator  rationalize  to_i    truncate
  #   denominator  gcd     lcm       ord        round        to_int  upto    
  # Fixnum#methods: 
  #   %  **  -@  <<   ==   >=  ^           div     fdiv       modulo  succ  zero?
  #   &  +   /   <=   ===  >>  abs         divmod  inspect    odd?    to_f  |    
  #   *  -   <   <=>  >    []  bit_length  even?   magnitude  size    to_s  ~


我不认为有一种方法可以准确地检查局部变量的定义位置。但是,您始终可以在控制台中反向搜索以查看定义它的行:

Ctrl + r: foo = => (reverse-i-search)`foo =': foo = 42

使用owner。它给出了定义方法的模块。

class A
  def foo; end
end

class B < A
end

B.new.method(:foo).owner # => A