Ruby 看起来和其他动态编程语言很像,但有一个重要的区别:每个值都是一个对象,而且对象彼此之间靠发送消息进行通信 1。每个对象都有自己的方法集合,这些方法决定了它如何响应特定的消息。 一个消息有一个名字,并且根据需要可以有一些参数。一个对象收到一个消息的时候,它对应的方法就会使用消息中的参数作为自己的参数执行。这就是 Ruby 完成全部工作的方式;甚至“1+2”都意味着“使用参数 2 给对象 1 发送一个叫作 + 的消息”,而对象 1 有一个处理那个消息的方法 #+。 我们可以使用关键字 def 定义自己的方法: >> o = Object.new => #<Object> >> def o.add(x, y) x + y end => nil >> o.add(2, 3) => 5 这里,我们通过向一个特殊内建对象 Object 发送 new 消息来新建一个对象;新对象创建之后,在其上定义了一个叫 #add 的方法。#add 方法把它的两个参数加在一起,并返回结果;因为一个方法中最后执行的表达式的值将被自动返回,所以并不需要一个显式的 return。在使用 2 和 3 作为参数向那个对象发送 add 消息之后,#add 方法就会执行,然后我们就得到了想要的结果。 通常情况下,在发送消息时要写上接收对象和消息名并用圆点分隔(例如 o.add),但是Ruby 会一直追踪当前对象(叫作 self),这样在向当前对象发送消息时只需写上一个消息名,接收对象可以不必显式写出来。例如,在一个方法定义内部,当前对象总是接收消息并执行此方法的对象,因此在一个特定对象的方法内部,向同一个对象发送其他消息时,可以不必显式提及: >> def o.add_twice(x, y) add(x, y) + add(x, y) end => nil >> o.add_twice(2, 3) => 10 注意,我们在 #add_twice 方法里给 o 发送 add 消息时,可以不必写成 o.add(x, y),只写add(x,y) 就可以,这是因为 o 是接收 add_twice 消息的对象。 在所有的方法定义之外,当前对象是一个叫 main 的特殊顶层对象,任何没有指明接收者的消息都会被发送给它;同样,任何没有指明对象的方法定义都可以通过 main 使用: >> def multiply(a, b) a * b end => nil >> multiply(2, 3) => 6 注 1:这种来自于编程语言 Smalltalk 的风格,对 Ruby 的设计有直接影响。
计算的本质——1.4 对象和方法
书名: 计算的本质
作者: [英] Tom Stuart
出版社: 人民邮电出版社
原作名: Understanding Computation: From Simple Machines to Impossible Programs
副标题: 深入剖析程序和计算机
译者: 张伟
出版年: 2014-11
页数: 300
定价: 69.00元
装帧: 平装
ISBN: 9787115361547