Ruby中,类方法和实例方法的一个有趣的例子
最初的代码如下:
class Object
def abc
p "instance abc"
end def self.abc
p "class abc"
end
end obj=Object.new obj.abc #instance abc
Object.abc #class abc
修改一下:
class Object
def abc
p "instance abc"
end
end obj=Object.new obj.abc #instance abc
Object.abc #instance abc
再修改一下:
class Object
def self.abc
p "class abc"
end
end obj=Object.new obj.abc #error: undefined method 'abc' for xxx
Object.abc #class abc
究其原因:
1、类方法,是“该类的单例类”的实例方法;
2、Object类的单例类的父类是Class类,Object类同时又是Class类的父类:得出结论,Object类是它的单例类的父类,也就是说,Object类的实例方法,也是它的类方法
3、实例方法的查找过程只查找类的继承层次,而不会查找单例类
4、补充一下,类的继承层次,在单例类中被保持住,比如class A < B,则A的单例类也继承自B的单例类
参见:
1、浅析 ruby meta-class - 坏份子 - 博客园
Ruby中,类方法和实例方法的一个有趣的例子的更多相关文章
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...
- java中使用split分割字符串一个有趣的现象
最近在项目中,发现了一个bug,充分了展示了自己对java底层的认知有很多的不足和欠缺. 下面有段代码: String str="1#2#3"; String[] strs=str ...
- ruby中的整数、浮点数、字符串之间的相互转换
D:\learnProg\Ruby>irb#浮点数转换成整数,会强行去掉小数点后面的数字 irb(main):017:0> 123.45.to_i => 123 #整数转换成浮点数, ...
- objective-c中类似ruby枚举类的实例方法
虽然obj-c的语法格式略显繁琐,但它和ruby都从某些方面继承了smalltalk的某些动态的东西.这些东西是 C和C++之类的静态语言所不曾有的. 比如ruby中可以将一个类或对象的所有方法枚举出 ...
- OC类方法和实例方法中的self区别
OC类方法和实例方法中的self Objective-C里面既有实例方法也类方法.类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenien ...
- dubbo debug过程中一个有趣的问题
最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...
- objc中的类方法和实例方法有什么本质区别和联系
类方法: 类方法是属于类对象的 类方法只能通过类对象调用 类方法中的self是类对象 类方法可以调用其他的类方法 类方法中不能访问成员变量 类方法中不能直接调用对象方法 类方法是存储在元类对象的方法缓 ...
- python中的类方法,实例方法和静态方法的区别
类方法是类的方法,在定义的时候要在上方加上一个@classmethod装饰器来进行装饰,形参是cls,类和实例都可以取调用类方法: 实例方法是实例对象方法,只有实例可以调用,类是不能调用的,形参是se ...
- ruby 类方法、实例方法、类变量
###################### #类变量 ###################### class Cloud @@count=0 def initialize(user,passwor ...
随机推荐
- 移动web开发框架研究
纯粹的总结一下移动web开发框架,移动web开发框架有jQuery Mobile .Sencha Touch等等,他们都来源于web开发,是成熟的框架.jQuery Mobile出自于jQuery家族 ...
- C#。4.1数组的应用
数组的应用 (一).冒泡排序.1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.2.趟数=n-1:次数=n-趟数.3.里层循环使用if比较相临的两个数的大小,进行数值交换. 代码 in ...
- 关于CSRF攻击及mvc中的解决方案 [ValidateAntiForgeryToken]
http://blog.csdn.net/luck901229/article/details/8261640
- Android -------- 序列化器生成xml文件
- iOS 点击cell下拉
iOS 点击cell下拉 代码如下: #import "ViewController.h" @interface ViewController ()<UITableView ...
- OC基础 NSDate
OC基础 NSDate #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @auto ...
- HDU 5141
这个题 LIS + 并查集的思想 + 链式前向星 要求找s(i,j)使i j 能有最长的LIS ... 做法是枚举每一个j 即终点 算 起点 的可能 无力吐槽了 bc 的时候写错了一个地方 ...
- UVa 10098: Generating Fast
这道题要求按字典序生成字符串的全排列,不可重复(但字符可以重复,且区分大小写). 基本思路是先对输入的字符串按字典序排序,然后从第一位开始递归,从所有输入的字符中选出一个填充,然后再选第二位..... ...
- 利用.htaccess绑定域名到子目录
前提首先得把域名绑定绑定了,比如把dev.ccvita.com解析到211.136.108.190这个IP其次是在网站管理面板里,为网站绑定dev.ccvita.com最后编辑配置.htaccess文 ...
- php目录分隔符DIRECTORY_SEPARATOR
在windows我们习惯性的使用“\”作为文件分隔符,但是在linux上系统不认识这个标识,于是就要引入这个php内置变量了:DIRECTORY_SEPARATOR 路径分隔符 windows \ o ...