Ruby Programming | 连载 07 - Ruby 对象的原生行为

简介: Ruby Programming | 连载 07 - Ruby 对象的原生行为

一、对象的原生行为/方法

Ruby Programming | 连载 06 - Ruby 面向对象 中我在对象创建之后给对象添加了各种行为或者方法,但是对象本身也是自带一些行为或者方法的,我能将自带的行为成为对象的原生行为,也就是说对象能响应一组消息。

查看对象的原生行为列表,可以通过调用对象的 methods 方法(methods 方法也是对象的一个原生行为),在 irb 中获取对象的原生行为列表,显示结果如下:

image.png

调用 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 进行判断,代码如下所示:

image.png

即使对象的内容相同,但是实际上是两个不同的对象,因为它们的 ID 不同。

image.png

对象 ID 与对象相等性

Ruby 中比较对象的不同类型(对象的内容,对象的 ID 或者对象的其他属性等)的相等性有许多方式,对于两个字符串来说,可以比较两个字符串的内容也可以比较它们的 ID 是否相同,对于其他对象也可以比较其他的属性。

respond_to? 判断对象是否具有指定的行为/方法

Ruby 是一种动态语言,当 Ruby 对象调用一个方法时,只有在运行时才会去判断对象是否具有调用的这个方法,判断是否具有某个方法就会用到 respond_to? 方法,如果对象不包含调用的方法,则会曝出 ”undefined method xxx“。

respond_to? 常与条件语句联合使用,用于在调用方法前判断对象是否具有指定方法,代码如下图所示:

image.png

respond_to? 需要传递一个字符串格式的方法名作为参数,并且返回值为布尔值,如果包含指定的方法则返回 true,否则返回 false。

respond_to? 是自省或者反射的一个例子,反射可以在程序运行期间进行状态检查,Ruby 提供了许多自省机制的工具或者方法,而之前的 methods 方法则是另一种自省或者反射技术。

send 方法发送信息给对象

在前面的例子中我们都是通过打点(.)来调用方法的,除此之外还可以使用 send 方法来调用指定的方法。

image.png

通过 . 调用方法与通过 send 方法调用函数的效果是一样的,另外 send 方法与 __send__public_send 方法的效果是一样的。之所以会有 __send__public_send 是为了避免与用户自定义类中的 send 方法冲突。

大多数时候都会使用 . 来调用方法,但是将 send 作为备选方案是非常有用和强大的。


相关文章
|
8月前
|
Ruby
一些奇怪的 Ruby 行为
一些奇怪的 Ruby 行为
|
存储 Ruby
Ruby Programming | 连载 10 - Ruby 的类
Ruby Programming | 连载 10 - Ruby 的类
|
Scala Ruby
Ruby Programming | 连载 09 - Ruby 变量
Ruby Programming | 连载 09 - Ruby 变量
Ruby Programming | 连载 08 - Ruby 方法参数
Ruby Programming | 连载 08 - Ruby 方法参数
Ruby Programming | 连载 08 - Ruby 方法参数
|
Java C++ Ruby
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
|
Linux 数据库 Ruby
Ruby Programming | 连载 05 - Ruby 工具集
Ruby Programming | 连载 05 - Ruby 工具集
|
存储 Java 数据挖掘
Ruby Programming | 连载 04 - Ruby 扩展基础
Ruby Programming | 连载 04 - Ruby 扩展基础
|
存储 IDE 开发工具
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础
|
存储 对象存储 Ruby
Ruby Programming | 连载 02 - Ruby 语法基础
Ruby Programming | 连载 02 - Ruby 语法基础
|
IDE Java Linux
Ruby Programming | 连载 01 - Intro and Setup
Ruby Programming | 连载 01 - Intro and Setup
Ruby Programming | 连载 01 - Intro and Setup