一个 对象 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 打印出来。比如:
> irb
irb(main):001:0> [].method :min
=> #<Method: Array(Enumerable)#min>
可以看出数组的 min
方法来自 Enumerable
module.
如果用 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