一个 对象 obj 有个 method: foo, obj.foo
因为 obj 继承了很多 Class 也 mixin 了若干 Module 现在 想知道 foo 方法来自于哪个 Class 或者 Module 不知道怎么解?哪位高手给指点一下?
现在的问题是 foo 在 Class 和 Module 里面,不止定义了一次。 所以,希望知道真正用的是哪一个?
多谢!
自己想了一个方法: obj.class.ancestors.select { |c| c if c.instance_methods(false).include? :foo }
ruby 寻找 method 的过程是这样的吧?
用 .method() 方法拿到 Method 对象,其 inspect 方法默认会给出定义位置。也就会被 irb 打印出来。比如:
.method()
Method
inspect
> irb irb(main):001:0> [].method :min => #<Method: Array(Enumerable)#min>
可以看出数组的 min 方法来自 Enumerable module.
min
Enumerable
哇,真的,又学了一招 呵呵 多谢!
#2 楼 @5long 擦,我才知道
Method 对象有 owner 和 location 方法可以看
学到了
source_location 直接定位 source code 文件,真是方便啊!
如果用 pry 的话,使用show-method可以找到,而且直接把源代码显示出来
pry
show-method
[3] pry(User):1> show-method database_authenticatable From: /Users/joker/pasokara_player_rails3/vendor/bundle/ruby/1.9.1/gems/devise-2.0.0/lib/devise/schema.rb @ line 16: Number of lines: 8 Owner: Devise::Schema Visibility: public def database_authenticatable(options={}) null = options[:null] || false default = options.key?(:default) ? options[:default] : ("" if null == false) include_email = !respond_to?(:authentication_keys) || self.authentication_keys.include?(:email) apply_devise_schema :email, String, :null => null, :default => default if include_email apply_devise_schema :encrypted_password, String, :null => null, :default => default, :limit => 128 end
又学到了,惭愧,拿着 pry 当 irb 用 呵呵
@xuluan 看元编程,讲的很清楚。。。