新手问题 如何查看定义某个方法的类或模块

seanlin · 2016年05月22日 · 最后由 Niatruc 回复于 2019年10月31日 · 3337 次阅读

看书时看到说 printf 和 sprintf 不是 String 类的方法,想追踪一下定义这个方法的类或者模块。 只知道可以通过.ancestors 和.class.ancestors 来查看实例,和类的从属/继承关系谱。不知道有没有类似的方法可以查看方法所属的类或者模块。还是说这样的方法只能用于对象来查看,方法不是对象所以不能这样。 如果没有...就只能去查文档了...

在不考虑第三方 gem 的情况下,可以把方法转为 Method 对象来取得一些信息

p method(:printf)
p method(:printf).owner

pry show-source

#1 楼 @skandhas 嗯嗯,用这个方法查到了,依葫芦画瓢原来 method 这个方法也封装在 Kernel 里的,挺实用的,谢谢了

还是有点一知半解的是,如图:method就是这里调用的 method 方法吗?我查了一下文档,如图意思,把方法当成对象返回一个名字(不知道我理解的对不对,应该是封装成对象吧,所以才可以.owner 这样的方法调用)

这里前后各两个"_"是什么关键字的意思吗?不是很理解。烦请解答。

#2 楼 @guyanbiao 请问这个具体是什么用法呀?

#3 楼 @seanlin

__method__method 是两个不同的的方法。

Kernel.methods 的输出太多,用 grep 筛选下,就能看到 method

Kernel.methods.grep /^method$/    #=> [:method]

如果要具体看方法定义的话,可以类似下面这样:

class A
  def foo
  end
end

file, line = A.instance_method(:foo).source_location
# or
file, line = A.new.method(:foo).source_location
puts "Method foo is defined in #{file}, line #{line}"
# => "Method foo is defined in temp.rb, line 2"

source_location +1

楼上各位大佬都好强😷 每次用 ruby 遇到问题时来搜一下解决方法,总能学到不少黑魔法😷

需要 登录 后方可回复, 如果你还没有账号请 注册新账号