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
在调试 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