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 ...
随机推荐
- (第三章)Java内存模型(中)
一.volatile的内存语义 1.1 volatile的特性 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步.下面通过具体 ...
- Java基础知识强化53:经典排序之选择排序(SelectionSort)
1.选择排序的原理图: 2. 选择排序代码实现: package cn.itcast_02; /* * 数组排序之选择排序: * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在 ...
- linux查看系统版本
RHEL7.0以下,查看系统版本的方式: [rusky@rheltest1 ~]$ cat /proc/version Linux version -.el6.x86_64 (mockbuild ...
- jquery之checkbox
//checkbox 数据回显 var publishRange=rowData.publishRange.split(","); for(var i = 0;i < pub ...
- 【转】tkinter实现的文本编辑器
此代码是看完如下教学视频实现的,所以算是[转载]吧: 效果: 代码: # -*- encodin ...
- iOS中你必须了解的多线程
多线程概念详解 什么是进程? 简单的说进程就是我们电脑上运行的一个个应用程序,每一个程序就是一个进程,并且每个进程之间是独立的,每个进程运行在其专用受保护的内存空间内(window系统可以通过任务管理 ...
- POJ3641 Pseudoprime numbers(快速幂+素数判断)
POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Car ...
- USB OTG to PC USB API简介
本API分为四部分:Linux或Android内核 (主要是gadget驱动).linux端API及其DEMO.Windows 驱动.Windows API及其Demo. 一.linux.Androi ...
- Symfony2中的设计模式——装饰者模式
装饰者模式的定义 文章链接:http://www.hcoding.com/?p=101 个人站点:http://www.hcoding.com/ 在不必改变原类文件和使用继承的情况下,动态地扩展一个 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...