介绍完了 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 变量、常量以及对象
