一、Ruby 面向对象
在 Ruby Programming | 连载 03 - Ruby 对象基础 这篇文章中,已经了解到了 Ruby 对象的基础,本文中将深入的了解 Ruby 的面向对象特性。
在 Ruby 程序中,大部分的代码都是围绕对象展开的,编写程序时的主要动作就是创建对象,赋予对象一些方法或者行为,并执行这些行为。比如当需要程序实现计算、输出或者比较操作时,都需要通过对象来完成,比较两个数是否相等不是直接比较,而是通过调用方法判断 A 是否等于 B。
在流行的面向对象编程语言中,如 Java、Python、C++,包括 Ruby,每个对象都是一个样例或者既定类的实例以及独立对象的行为,至少在一定程度上,这些对象的行为都是在类中的方法所定义的。
Ruby 提供了一套完整的,包括了对象命名、创建、指向和操作的工具,以及处理这些对象和对象操作数据的方式或者规则。
给对象添加行为
面向对象的概念是非常简单的,生活中的一本书、一瓶水、一辆车或者一栋房子都可以看做一个对象,对象是真实存在的,相对来说类是一种抽象的东西,类中定义了属性和行为;当然在动态语言中,也可以为对象动态的添加一些行为后者方法。
接下来先来看如何操作一个 Ruby 对象,并给这个对象定义行为,通过一个 Object 类来初始化一个 obj 对象:
obj = Object.new 复制代码
Ruby 中 BasicObject 是最顶层的父类,Object 继承自 BasicObject,不过先不用关心这些。先来看一看 obj 对象可以进行什么操作。
定义对象的行为
行为即方法,Ruby 中定义一个方法需要用到 def
关键字,比如使用 def
给 obj 对象添加一个 say_hi 方法
def obj.say_hi puts "Hi" puts "This is Ruby SPEAKING" end 复制代码
发送消息到对象(对象调用方法)
obj.say_hi 复制代码
定义带参数的行为
Ruby 中的方法类似数学函数,执行步骤都是:输入数据,执行函数体,最后输出结果,给 Ruby 方法输入可以在调用方法时提供一个或者多个参数。
在方法定义时可以在方法名之后的括号中指定传递的参数名,参数分为可选参数和必选参数,这里先来了解下必选参数,当调用方法时要传入必选参数才能调用成功。
我们将方法中定义的参数成为形式参数,实际调用传递的参数成为实际参数
我们给 obj 对象定义一个 intro 函数,该函数需要传入一个 name 参数,代码如下:
def obj.intro(name) puts "My name is #{name}" end 复制代码
这里的 #{name}
是插值表示法。
接着通过打点方式来调用 intro 函数,并传入一个 name 变量,代码如下:
obj.intro("Ruby") 复制代码
输入结果如下:
调用时传参的圆括号可以省略,比如 puts 函数调用时常将圆括号省略。
定义方法的返回值
在 irb 中上面执行两个方法的代码时都会出现 => nil
,这里表示的意思是返回值为空,nil
就表示一个空对象。
Ruby 中定义方法的返回值需要使用到 return
关键字,return
关键字也是可选的。这里给 obj 对象再定义一个具有返回值的函数,代码如下:
def obj.add(x, y) put "output x + y" return x + y end 复制代码
调用 obj 对象的 add 方法,输出结果如下:
当然我们也可以通过一个变量来接收 add 方法返回的值。
Ruby 中的方法只允许有一个返回值,当 return 关键字后有多个返回值时,Ruby 会将它们放到一个数组中并返回。
上述方法中定义了一个 multi_ret 函数,该函数通过 return 返回了 1,2,3,4 四个数,但是我们通过一个变量来接收 multi_ret 方法的返回值,通过输出变量的类型来看,实际上 Ruby 是将 return 后面的四个数转换成了一个数组后再进行输出的。