1.4 对象和方法
Ruby 看起来和其他动态编程语言很像,但有一个重要的区别:每个值都是一个对象,而且对象彼此之间靠发送消息进行通信 1。每个对象都有自己的方法集合,这些方法决定了它如何响应特定的消息。
1这种来自于编程语言 Smalltalk 的风格,对 Ruby 的设计有直接影响。
一个消息有一个名字,并且根据需要可以有一些参数。一个对象收到一个消息的时候,它对应的方法就会使用消息中的参数作为自己的参数执行。这就是 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论