ruby如何查找一个方法属于哪个类

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

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的简写

时间: 2024-12-03 08:40:53

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

详解Ruby中的单件方法和单件类_ruby专题

单件方法 Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法 示例代码 str = "just a regular string" def str.title? self.upcase == self end str.title? # => false str.methods.grep(/title?/) # => [:title?] str.singleton_methods #=> [:title?] str.class # => S

在Ruby中查找和执行方法_ruby专题

当调用一个方法时,Ruby会做两件事. 1.找到这个方法.这个方法称为方法查找. 2.执行这个方法.为了做到这点,Ruby需要一个叫做self的东西. 这样的一个过程--发现一个方法再执行之--在每种面向对象语言中都会发生.不过,对于像Ruby这样非常动态的语言,深入理解这个过程显得尤为重要.你有没有好奇过一个方法究竟定义在哪里呢?如果有,那绝对应该深入理解方法查找及self. 当调用一个方法时,Ruby会在对象的类中查找那个方法.不过,在给出更复杂的例子之前,你需要了解两个新概念:接收者(re

java-Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了!

问题描述 Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! 麻烦大家了 解决方案 直接作为参数传就是了 void f1() { int[] x = {1,2,3,4,5}; f2(x[1]); } void f2(int n) { } 解决方案二: Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题 解决方案三: 可以使用全局变量的方

android中的service本质是一个类还是一个方法还是一个对象

问题描述 android中的service本质是一个类还是一个方法还是一个对象 android中的service本质是一个类还是一个方法还是一个对象 当然我明白java中一切都是对象的这种说法 解决方案 service在哪里看到的,作为类的定义它是类,对它实例化创建了对象并且执行就是对象了. 解决方案二: java中一切都是对象 这个说法其实不准确.你能说java中的关键字是对象么? 解决方案三: Service(服务)是Android 核心组件之一,特点就是Android系统帮你实例化他的对象

android中内容提供者的本质是一个类,那么广播接收器的本质是一个方法吗

问题描述 android中内容提供者的本质是一个类,那么广播接收器的本质是一个方法吗 android中内容提供者的本质是一个类,那么广播接收器的本质是一个方法吗 解决方案 广播接收器,也可以设计成一个类,并不一定是方法. 就算现在的 Android 设计成一个方法,但也并不是说必须,或者只能设计成一个方法.

java-如何理解一个方法的参数为内嵌类

问题描述 如何理解一个方法的参数为内嵌类 如何理解一个方法的参数为内嵌类,能否举个例子,谢谢 解决方案 ListView控件里面有一个ListItem代表条目的内嵌类.ListView有一个add方法允许你添加条目到ListView中. 解决方案二: 比如 class ListView { class ListItem { } public void add(ListView.ListItem item) { ... } } 解决方案三: Bitmap类getPixels()方法中参数strid

java匿名类-你好,new一个方法不是生成一个对象,怎么就生成了一个匿名类呢

问题描述 你好,new一个方法不是生成一个对象,怎么就生成了一个匿名类呢 你好,new一个方法不是生成一个对象,怎么就生成了一个匿名类呢 我对new关键词的用法不是很清楚 解决方案 先看段伪代码 abstract class Father(){ .... } public class Test{ Father f1 = new Father(){ .... } //这里就是有个匿名内部类 } 一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了. 但是出现匿名内部类就

实例-一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗?

问题描述 一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗? 通过单例创建一个实例,下次调用实例 和 每次都通过单例方法创建有什么不同? 解决方案 既然是单例,每次调用都使用第一次创建的对象,不会每次都创建. 也许你想说单例和静态方法的区别.单例的对象可以继承,但是静态方法不行. 解决方案二: 一个方法里需要使用单例创建一个实例变量,这个实例变量需要多次使用. 每次使用多用时都用单例创建和第一次使用单例创建一个实例变量,以后直接调用实例变量.这两种方法有什么不同?那个更好 解

javascript-js类中一个方法无法调用弄一个方法

问题描述 js类中一个方法无法调用弄一个方法 <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> function ui(){ this.we=function(){ alert("wed"); } this.test=function(e