这是一个看似简单,实际不那么直接的问题。一种方法是先直接看当前对象的类是神马东东:

puts self.class 或者 self.class.name

不过在某些情况下上述代码返回不了具体的名称,前者返回一个<Class:xxx>后者返回nil;这是咋回事呢?原因是你在元类或称为单例类中,比如下面的情况:

class A; end

a=A.new

class<<a

puts a #like self.class

puts a.name #like self.class.name

end

那我怎么知道对象真正的类名呢?很简单,用ancestors方法!看似问题解决鸟,不过实际是很残酷的。我下面取得了某个类的所有祖先类和模块,你来告诉我一个名叫h的方法是在哪定义的:

[#<Class:0x007ff16ec3bbf0>, #<Module:0x007ff1699a2060>, #<Module:0x007ff169a8ba08>, ProjectsHelper, ApplicationHelper, #<Module:0x007ff169428d50>, ActionDispatch::Routing::RouteSet::MountedHelpers, #<Module:0x007ff16ec3bb50>,
#<Module:0x007ff16d020038>, #<Module:0x007ff16d020060>, ActionView::RoutingUrlFor, ActionDispatch::Routing::UrlFor, ActionDispatch::Routing::PolymorphicRoutes, ActionController::ModelNaming, Turbolinks::XHRUrlFor, ActionView::Base, Sprockets::Rails::Helper,
WebConsole::ViewHelpers, ActionView::Helpers, ActionView::Helpers::TranslationHelper, ActionView::Helpers::RenderingHelper, ActionView::Helpers::RecordTagHelper, ActionView::RecordIdentifier, ActionView::Helpers::FormHelper, ActionView::ModelNaming, ActionView::Helpers::NumberHelper,
ActionView::Helpers::JavaScriptHelper, ActionView::Helpers::FormOptionsHelper, ActionView::Helpers::FormTagHelper, ActionView::Helpers::TextHelper, ActionView::Helpers::DebugHelper, ActionView::Helpers::SanitizeHelper, ActionView::Helpers::CacheHelper, ActionView::Helpers::AtomFeedHelper,
ActionView::Helpers::UrlHelper, ActionView::Helpers::AssetTagHelper, ActionView::Helpers::AssetUrlHelper, ActionView::Helpers::ActiveModelHelper, ActiveSupport::Benchmarkable, ActionView::Helpers::TagHelper, ActionView::Helpers::OutputSafetyHelper, ActionView::Helpers::DateHelper,
ActionView::Helpers::CsrfHelper, ActionView::Helpers::ControllerHelper, ActionView::Helpers::CaptureHelper, ERB::Util, ActionView::Context, ActionView::CompiledTemplates, Object, ActiveSupport::Dependencies::Loadable, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object,
Kernel, BasicObject]

老大一坨嵌套啊!别笑,这是一个真实环境中的例子,确切的说是rails中的例子。要想知道h在哪里定义的我们可以用如下方法:

<% self.class.ancestors.each do |a| %>
	<% unless a.methods(false).select {|m|m=~/^h$/}.empty?%>
		<p><%= a.name%></p>
	<% end %>
<% end %>

如果h不是public方法的话,也很简单,把a.methods改为a.xxx_methods就可以鸟,有些时候就是要碰运气的哦!比如上面几行代码很快返回了结果:ERB::Util,虽然用ri ERB::Util#h还是不知道h是干嘛的...

好吧,知道了,h是html_escape的简写

ruby如何查找一个方法属于哪个类的更多相关文章

  1. Eclipse的各种查找,类的查找,方法查找快捷键

    eclipse开发中,查找会是一个经常用到的功能所以总结一下1,查找一个类 Shift + Ctrl + h 这种方式能快速的定位接口,类还有注解在那个包里面2.综合查找 Ctrl + H 这是一种综 ...

  2. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  3. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  4. Hibernate的多表查询,分装到一个新的实体类中的一个方法

    不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...

  5. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    参考原贴地址:https://blog.csdn.net/clementad/article/details/47339519 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Trans ...

  6. 【转】在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    参考 原文链接 @Transactional does not work on method level 描述 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational) ...

  7. 编程写一个方法时,注意方法中传参数的数量最好不要超过5个,超过5个怎么办?可以用struct或class,或一个字典类

    图  1 一.从图1发现了什么问题呢? 答案:1.参数传的的太多了:2.另外注释也没写好. 说明:一个方法中,传参数的数量最好不要超过5个. 应该采用:struct或class,或一个字典类都行.其中 ...

  8. 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;School 中计算平均分的方法是所有科目的分数之和除以总科目数。 要求:定义ComputerAv

    题目: 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数. 定义 Gymnastics 类和 School 类,它们都是 ComputerAverag ...

  9. 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC ...

随机推荐

  1. Python读取JSON数据,并解决字符集不匹配问题

    今天来谈一谈Python解析JSON数据,并写入到本地文件的一个小例子. – 思路如下 从一个返回JSON天气数据的网站获取到目标JSON数据串 使用Python解析出需要的部分 写入到本地文件,供其 ...

  2. hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理

    两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...

  3. Dynamics CRM 将实体从高级查找列表中移除不可见

    有时我们不需要将某个实体显示给一般用户比如配置实体,但是这种类型的实体有时候又需要给一般用户读权限ODATA的时候得能读,站点地图上的隐藏比较容易用工具配置下权限即可.其实做到这步一般就可以了但有的客 ...

  4. nginx+uwsgi+django 部署原理

    python开发群里经常有同学问 nginx+uwsgi+django 着了教程部署,但是不知道他们之间怎么样的关系,于是我就google到了一个让我看起来很认同的图,大家看了也比较认同,于是就分享出 ...

  5. Android 面向协议编程 体会优雅编程之旅

    Android中面向协议编程的深入浅出 http://blog.csdn.net/sk719887916/article/details skay编写 说起协议,现实生活中大家第一感觉会想到规则或者约 ...

  6. SharePoint 2013: The "New Web Application" button is disabled is the central administration

    安装完sharepoint foundation2013后,直接通过url访问管理中心,想进application management去新建的话会发现新建按钮是灰色的,即使你用的是系统管理员账号并且 ...

  7. 分布式内存网格Hazelcast源码导读

    去年项目需要看了hazelcast源码,当时记录的笔记. Node是节点的抽象,里面包含节点引擎.客户端引擎.分区服务.集群服务.组播服务.连接管理.命令管理.组播属性.节点配置.本地成员.tcp地址 ...

  8. 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)

    当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚 ...

  9. 不窃取用户隐私的搜索引擎: DuckDuckGo

    不窃取用户隐私的搜索引擎: DuckDuckGo https://duckduckgo.com/ 最近goggle不给力, baidu搜出来的很多都是垃圾, bing用久了很烦. 于是用上了DuckD ...

  10. pig基础知识总结

    Pig Latin UDF语句 REGISTER   在Pig运行时环境中注册一个JAR文件 DEFINE      为UDF.流式脚本或命令规范新建别名 Pig Latin命令类型 kill    ...