Ruby 的对象没有方法:方法查找到底怎么走
来源:dev.to — 2026-10-21 · 约 7 分钟阅读
📋 概述
教科书说对象把数据和方法打包在一起,作者从 CRuby 源码否掉这句话:一个对象(RObject)里只有实例变量、内部标志和一个指向类的 klass 指针,一行方法代码都没有。方法全部存在类(RClass)的 m_tbl 哈希表里,调用 user.greet 时 Ruby 顺着 klass 指针找到类,再沿祖先链逐级查表。单例方法之所以只作用于一个对象,是因为 Ruby 在背后插入了一个隐藏的 eigenclass。
🔑 核心要点
- 对象负责存状态,类负责存方法,方法表 m_tbl 属于类而不是实例。
- user.greet 的执行顺序是:读 klass 指针、在类的 m_tbl 里找符号、找不到再沿祖先链向上。
- 给单个对象定义方法会创建 eigenclass,它被插到该对象祖先链的最前端,因此只影响这一个对象。
- 「一切皆对象」是语法层面的说法,底层是 RObject 与 RClass 两套结构的分工。
💡 金句
“In Ruby, objects contain zero methods.”
译:在 Ruby 里,对象包含零个方法。
← 返回 dev.to 首页