今天看了《Ruby元编程》,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家。其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧。

首先来说明一下,作为一种面向对象语言,Ruby中自然包含两个感念,即“类”与“对象”。一般而言,类是一组方法和一组数据的集合,而对象则可以看作是类的实例化。需要注意的是,在Ruby中“对象是由实例变量和一个类的引用组成”(《Ruby元编程》),这句话是什么意思呢?让我们先来看一个书中的示例,了解一下什么是实例变量,以及它具有的特性

class MyClass
def my_method
@v = 1
end
end
obj = MyClass.new
obj.instance_variables
obj.my_method
obj.instance_variables

此时,系统给出的输出是

 => []

=> [:@v]

从中可见,对象obj的实例变量就是@v,但是相信大家也注意到了,当obj未执行my_method时,obj对象不具备任何实例变量,也即是说,对象obj的实例变量与类MyClass没有任何关联,它只是在执行过程中生成的。而这正是Ruby与其他静态语言的差别之一。

前文提到了,类是由数据和方法组成的,而对象作为类的实例化,也自然具备方法。探讨了数据之后,我们再来看看Ruby对象的方法。事实上,在Ruby的对象中并没有存储方法,而是将方法存储到了类中,因此对象必须存储其自身的类,在此例中极为MyClass,我们可以通过相关代码来查看:

obj.class 

# => MyClass

如果你了解C#或Java,也许你会说,my_method难道是类的静态方法?其实这是一种错误的理解,正确的说法是:my_method是类的实例方法(即必须通过定义类的实例才能使用),是对象obj的方法。而我们头脑中的“静态方法”在Ruby中被称为“类的方法”,是不是这些概念有点绕?没关系,我们再看一个例子(也是《Ruby元编程》中的):

String.instance_methods = "abc".methods

上面这个示例的返回结果是true,而

String.methods = "abc".methods

的返回结果则是false

是不是清楚了一些呢?

【注】另外再说一句,在所有类外定义的函数是全局函数,而这些所谓的全局函数其实是Object类的私有实例方法。

关于这一点,我们不妨做一个小的实验

首先定义一个函数

def test_method
puts "test Object methods"
end

此时,在irb中执行以下命令:

Object.private_methods

可以看到,test_method已经成为Object的私有函数了。

最新文章

  1. readonly
  2. .offset().top是什么意思?
  3. CF 445B DZY Loves Chemistry(并查集)
  4. 十分钟学会python
  5. table表格的属性
  6. Socket异步发送的同步控制
  7. HTML+CSS+JS学习总结
  8. android GestureDetector 手势的判断
  9. JIRA官方:JIRA报表与分析
  10. PV操作——生产者和消费者
  11. 拦截所有AJAX调用,重点处理服务器异常
  12. 基于Azure blob storage T级别HBase表恢复
  13. 【HighCharts系列教程】五、版权属性——Credits
  14. 前端开发面试题总结之——HTML
  15. JS求数组差集的几种方法
  16. node.js面试题大全-侧重后端应用与对Node核心的理解
  17. qrcodenet二维码图片下扩展区域添加号段的操作
  18. i2c_client的生成
  19. Linux基础知识与基础命令
  20. 13.从url 输入网址到最终页面渲染完成

热门文章

  1. BZOJ 4771 主席树+倍增+set
  2. BZOJ 4491 分块OR差分+线段树
  3. POJ 2752 KMP中next数组的应用
  4. Hadoop MapReduce编程 API入门系列之网页排序(二十八)
  5. C#中的流_字节_字符_字符串之间的相互转换
  6. Redux入门
  7. Android Fragment 初步解析
  8. List 常用方法解析
  9. Appium 环境搭建 - macOS
  10. hdu2819 Swap 最大匹配(难题)