Ruby: 2.5.x, 2.6.x 

在Ruby中如何快速定位方法的定义位置, 接下来,我们看看一些示例代码

Method 1: Object#source_location

     1	#!/usr/bin/env ruby
     2
     3	class Color
     4	  def initialize
     5	  end
     6
     7	  def default_color
     8	    'black'
     9	  end
    10	end
    11
    12	puts "RUBY VERSION: #{RUBY_VERSION}"
    13	color = Color.new
    14	puts color.method(:default_color).source_location

如何运行:

> RBENV_VERSION=2.5.0 ruby color.rb                                                                                                                        
RUBY VERSION: 2.5.0
color.rb
7

> RBENV_VERSION=2.5.1 ruby color.rb                                                                                                                        
RUBY VERSION: 2.5.1
color.rb
7

> RBENV_VERSION=2.6.0-dev ruby color.rb                                                                                                                        
RUBY VERSION: 2.6.0
color.rb
7
Method2: Binding#eval

创建类文件 color.rb

     1	#!/usr/bin/env ruby
     2
     3	     class Color
     4	        def initialize
     5	         end
     6
     7	          def default_color
     8	            'black'
     9	          end
    10
    11	  def locationed
    12	    puts binding.eval('[__FILE__, __LINE__]')
    13
    14	    'location'
    15	  end
    16
    17	  def r26_location
    18	    puts binding.source_location
    19
    20	    'R 26'
    21	  end
    22	end
    23
    24	puts "RUBY VERSION: #{RUBY_VERSION}"
    25	color = Color.new
    26	color.locationed
    27	color.r26_location

Ruby 2.6 之前,如果我们要知道源码对应的文件和位置。我们需要使用 Binding#eval.

binding.eval('[__FILE__, __LINE__]')

Ruby 2.6 在底层增加了一个更具有可读性的方法 Binding#source_location, 来得到类似的结果。

binding.source_location