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 作为备选方案是非常有用和强大的。


相关文章
|
7月前
|
Ruby
|
7月前
|
Ruby
|
4月前
|
开发者 测试技术 Android开发
Xamarin 开发者的五大常见问题及解决方案:从环境搭建到性能优化,全面解析高效跨平台应用开发的技巧与代码实例
【8月更文挑战第31天】Xamarin 开发者常遇问题及解决方案覆盖环境搭建至应用发布全流程,助新手克服技术难关。首先需正确安装配置 Visual Studio 及 Xamarin 支持,设置 iOS/Android 测试环境。利用 Xamarin.Forms 和 XAML 实现高效跨平台开发,共享 UI 和业务逻辑代码。针对性能优化,采取减少 UI 更新、缓存计算结果等措施,复杂问题则借助 Xamarin Profiler 分析。
62 0
|
4月前
|
设计模式 缓存 测试技术
Ruby代理模式之谜:如何用简单的方法创建灵活的对象接口?
【8月更文挑战第31天】代理模式是一种设计模式,通过创建代理对象来控制对目标对象的访问,可在Ruby中通过Proc对象、模块混入等方式实现。本文介绍了代理模式的概念及其实现方法,并提供了缓存、验证和日志代理等应用场景的示例代码,帮助开发者更好地理解和运用这一模式,提升程序灵活性与健壮性。
38 0
|
7月前
|
Ruby
|
7月前
|
Ruby
|
Java C++ Ruby
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 08 - Ruby 方法参数
Ruby Programming | 连载 08 - Ruby 方法参数
Ruby Programming | 连载 08 - Ruby 方法参数
|
存储 IDE 开发工具
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础