[Dive into Ruby] Ruby 中的方法、类与模块

10/15/2017 posted in  编程语言 comments

介绍完了 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.newMath.asin 均是类方法,通过(Student,Math)来调用,而student.read,student.calculate 则是 Student 类的 student 实例的实例方法。同样的,Math.PIMath 类的类变量,而 student.agestudent 实例的实例变量

关于实例变量与类变量,如果不理解可以看看 [Dive into Ruby] Ruby Basic 变量、常量以及对象

Ruby 中的类(Class)

Ruby 中的模块(Module)