介绍完了 Ruby 的语言基础与控制流,对于 Ruby 也算有了一个比较亲密的接触了,接下来是一些比较常用的面向对象(Object Oriented)的思想与方法。 这一部分与其它的面向对象语言比较的类似,但依然有很多地方有着鲜明的 Ruby 特色。
Ruby 中的函数/方法(function/method)
首先,什么是函数
?
对于已经有编程基础的人来说,这是一个非常直白的问题,但是如果是要向没有接触过编程的人介绍函数呢? 我对函数的理解是这样的。
函数是一系列操作的集合体,有着定义的输入(
参数
),通过这个操作集合之后输出定义的结果(返回值)。
比如说,加法是一个函数,这个函数接收两个参数:加数与被加数,进行将两个输入参数相加的操作,最后返回出加法结果。
要说明下,函数
这个概念是属于面向过程的思想的,在面向对象的世界里,名字叫方法
。
那么方法
是什么,应该怎么理解呢?同样附上我的个人看法。
方法
是一个对象自身所能够拥有的操作手段,例如,Object
类实现了instanse_of?
方法,这个方法就是所有的Object
类的实例所能够拥有的操作,再例如,Math
类拥有Math.asin()
方法,这是Math
这个类
所拥有的操作。
从上面的描述中也可以看到,方法是属于 Object
的,而根据方法所属的 Object
不同,将方法分成两类:实例方法
、类方法
。
方法
的分类
实例方法与类方法,顾名思义,是分别属于实例的与类的方法。
关于实例
与类
的关系,在介绍类
的时候详细介绍。这里需要弄清楚的是:实例方法
是通过实例
来调用的,而类方法
则是直接通过类
来调用。
同样的,对比 Java 中的概念,实例方法
与类方法
基本上等同于 Java 中的 非静态方法
与 静态方法
。
在 Java 中,非静态方法通过类的对象调用,静态方法需要通过类调用。
简单的举两个例子。
student = Student.new
student.grade = 3
student.read()
student.calculate(Math.PI)
Math.asin(Math.PI/2)
在这个例子中,分别出现了类方法
与实例方法
,类变量
与实例变量
。 Student.new
与 Math.asin
均是类方法
,通过类
(Student
,Math
)来调用,而student.read
,student.calculate
则是 Student
类的 student
实例的实例方法
。同样的,Math.PI
是 Math
类的类变量
,而 student.age
是 student
实例的实例变量
。
关于实例变量与类变量,如果不理解可以看看 [Dive into Ruby] Ruby Basic 变量、常量以及对象