代码之家  ›  专栏  ›  技术社区  ›  SRack

从ruby文件访问pry的show source方法

  •  3
  • SRack  · 技术社区  · 7 年前

    有没有可能接近Pry's? show-source Ruby文件中的方法?如果是的话,这是怎么做到的?

    例如,如果我有这个文件:

    # testing.rb
    
    require 'pry' 
    
    def testing
      puts 'hi'
    end
    
    puts show-source testing
    

    然然 ruby testing.rb ,我想要输出:

    Owner: testing.rb
    Visibility: public
    Number of lines: 3
    
    def testing
      puts 'hi'
    end
    

    为了解释这一点的基本原理,我有一个测试存根方法,尽管最初的方法似乎是偶尔被调用,我认为输出调用的源以查看它来自哪里是很方便的。我知道有更简单的方法可以做到这一点,尽管从这个兔子洞开始,我有兴趣看看是否可以做到:)

    稍微扭头跑步 show-source show-source 显示了 Pry::Command::ShowSource 类,它继承自 Pry::Command::ShowInfo .

    pry::命令::showsource 显示三种方法: options , process content_for 尽管我没能成功打电话给任何人。

    我的最佳假设是 内容为 方法处理此问题,使用从父类(即 Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super]) 尽管我还没能破解这个。

    有人对此有什么想法或例子吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   3limin4t0r    7 年前

    Ruby有内置方法 Method#source_location 可用于查找源的位置。这个 method_source gem通过基于源位置提取源代码来构建这一点。但是,这不适用于在交互控制台中定义的方法。方法必须在文件中定义。

    下面是一个例子:

    require 'set'
    require 'method_source'
    
    set_square_bracket_method = Set.method(:[])
    
    puts set_square_bracket_method.source_location
    # /home/user/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/set.rb
    # 74
    #=> nil
    
    puts set_square_bracket_method.source
    # def self.[](*ary)
    #   new(ary)
    # end
    #=> nil
    

    记住,所有核心Ruby方法都是用C编写的,并返回 nil 作为源位置。 1.method(:+).source_location #=> nil 标准库是用Ruby本身编写的。因此,上述示例适用于 集合 方法。

        2
  •  1
  •   mrzasa    7 年前

    您可以不使用 pry 用一个 Object#method Method#source_location 如本答案所述: https://stackoverflow.com/a/46966145/580346

    推荐文章