看书时看到说 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 是两个不同的的方法。
__method__
method
Kernel.methods 的输出太多,用 grep 筛选下,就能看到 method
Kernel.methods
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 遇到问题时来搜一下解决方法,总能学到不少黑魔法