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

时间:2016-01-11 10:34:24

标签: ruby pry

在调试具有一定复杂性的ruby代码时,很容易被堆叠的方法定义和命名与局部变量的冲突混淆。

我正在寻找一种快速的方法来找出哪个方法或变量响应表达式,类似于$('.navbar-toggle').addClass('hidden-xs');

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

any_expression.identify

不幸的是,一个局部变量(如method(:happy) #=> #<Method: Object(Helper)#happy> method(:happy).source_location #=> ["/home/somebody/project/lib/helper.rb", 9] )将位于其前面,但happy=42仍将返回另一个方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

您不必使用$("#anchor-from").change(function(){ if($('#period-daily').is(':checked')){ console.log(finalStartDDIDate1); } else if($('#period-weekly').is(':checked')) { console.log(finalEndDDIDate1); } });作为前缀。如果类没有没有参数的构造函数,它将无法工作。

self.class.new

<小时/> 另一种方法是使用local_variables.include?(:foo) # local variable method(:foo) # method 关键字:

defined?

在pry中,您可以使用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

<小时/> 我认为没有办法确切地确定局部变量的定义。但是,您始终可以在控制台中反向搜索以查看定义它的行:

Ctrl + r 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 ~ =&gt; (反向搜索)`foo =':foo = 42

答案 1 :(得分:3)

使用owner。它为模块定义了一个方法。

class A
  def foo; end
end

class B < A
end

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