一、对象的原生行为/方法
在 Ruby Programming | 连载 06 - Ruby 面向对象 中我在对象创建之后给对象添加了各种行为或者方法,但是对象本身也是自带一些行为或者方法的,我能将自带的行为成为对象的原生行为,也就是说对象能响应一组消息。
查看对象的原生行为列表,可以通过调用对象的 methods 方法(methods 方法也是对象的一个原生行为),在 irb 中获取对象的原生行为列表,显示结果如下:
调用 methods 方法时,返回对象所包含的方法的列表。这些方法中有三个方法是非常重要的,它们分别是:
- object_id
- respond_to?
- send(__send__)
object_id 方法标识唯一对象
在 Ruby 中,每个都是一个独立的个体,就像每个人都有一个身份证号一样,object_id 方法返回的就是 Ruby 对象的身份证号,使用如下代码获取 Ruby 对象的 ID:
obj = Object.new puts "obj's id is #{obj.object_id}" str = "Hello" puts "str's id is #{str.object_id}" 复制代码
在判断两个对象是否相等时就可以使用 ID 进行判断,代码如下所示:
即使对象的内容相同,但是实际上是两个不同的对象,因为它们的 ID 不同。
对象 ID 与对象相等性
Ruby 中比较对象的不同类型(对象的内容,对象的 ID 或者对象的其他属性等)的相等性有许多方式,对于两个字符串来说,可以比较两个字符串的内容也可以比较它们的 ID 是否相同,对于其他对象也可以比较其他的属性。
respond_to? 判断对象是否具有指定的行为/方法
Ruby 是一种动态语言,当 Ruby 对象调用一个方法时,只有在运行时才会去判断对象是否具有调用的这个方法,判断是否具有某个方法就会用到 respond_to? 方法,如果对象不包含调用的方法,则会曝出 ”undefined method xxx“。
respond_to? 常与条件语句联合使用,用于在调用方法前判断对象是否具有指定方法,代码如下图所示:
respond_to? 需要传递一个字符串格式的方法名作为参数,并且返回值为布尔值,如果包含指定的方法则返回 true,否则返回 false。
respond_to? 是自省或者反射的一个例子,反射可以在程序运行期间进行状态检查,Ruby 提供了许多自省机制的工具或者方法,而之前的 methods 方法则是另一种自省或者反射技术。
send 方法发送信息给对象
在前面的例子中我们都是通过打点(.)来调用方法的,除此之外还可以使用 send 方法来调用指定的方法。
通过 .
调用方法与通过 send 方法调用函数的效果是一样的,另外 send 方法与 __send__ 和 public_send 方法的效果是一样的。之所以会有 __send__ 和 public_send 是为了避免与用户自定义类中的 send 方法冲突。
大多数时候都会使用 .
来调用方法,但是将 send 作为备选方案是非常有用和强大的。