Ruby 就教:怎么知道一个 method 继承自哪里 class 或 module?

xuluan · 2012年10月15日 · 最后由 virgil 回复于 2012年10月18日 · 3165 次阅读

一个 对象 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 的过程是这样的吧?

哇,真的,又学了一招 呵呵 多谢!

#2 楼 @5long 擦,我才知道

Method 对象有 owner 和 location 方法可以看

source_location 直接定位 source code 文件,真是方便啊!

如果用 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 看元编程,讲的很清楚。。。

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