Ruby Digest

本文详细探讨了Ruby编程语言中对象模型的核心概念,包括一切皆对象、类的真相、方法查找、执行方法等内容,并通过实例展示了如何在不复写已有方法的情况下为类添加新方法(猴子补丁)。此外,文章还介绍了Ruby中类、常量、方法查找和执行的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ruby Digest

装各种软件的过程中,看到了很多使用Rake的地方,以及 .yml等跟ruby有关系的东西。觉得了解下ruby多少有点好处,就买了本ruby元编程在家看。看的过程中不断惊叹,还有如此优美的语言!把其中自己觉得重要的东西记录在这里,遂成此文。

对象模型

  • 一切皆对象(类也是对象)

打开类

修改已有的类
class String
  def to_alphanumeric
    gsub /[^\w\s]/, ''
  end

为String添加 to_alphanumeric 方法(而不是复写String), 称之为猴子补丁(Monkey Patch)

  • Ruby中同名class只有一个,后续定义都是 modify
  • class关键字更像是作用域操作符而不是类型声明语句
  • 潜在的危险:复写已有的方法!(同名的时候)
  • 补救方法: selector 把复写控制在一定代码空间内

类的真相

class MyClass
  def my_method
    @v = 1
  end
obj = MyClass.new
obj.my_method
  • @v 称为obj的实例变量,类似于python里的self.v
  • my_method称为obj的方法, MyClass的实例方法, 记为MyClass#my_method
  • obj仅包含它的实例变量及对自身类的引用(及唯一object_id)
  • obj.methods 返回所有方法(方法都存在类里,而非对象里)
  • 类自身也是对象,其类为Class(Python里称为元类,一般为type)
  • Class 的父类为 Module, 父类为 Object, 父类为 BasicObject

常量

任何以大写字母开头的引用(包括类名和模块名)

  • 仅充当常量容器的模块,被称为命令空间(类似Python consts.py)

方法查找 Method Lookup

  • 接收者(receiver): 方法调用者
  • 祖先链(ancestors chain): superclass链(以及module, eigenclass)
  • .ancestors 得到祖先链
  • include 一个模块时,创建一个匿名类封装;该类称为 include class 或 proxy class

执行方法 Method Execution

  • self 隐式传入方法(python显式)
  • 当前对象一般是方法调用者
  • 特例:在Class Module作用域内,self就是这个Class或 Module
  • 包含多个模块时,后包含的在祖先链上方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值