Ruby中初始化类时传入self的作用及Knot.new(self)解析
绳结模拟代码疑问解答
1. attach_tail! 方法的作用
这个方法的核心就是给当前绳结实例绑定一个尾部绳结。它会创建一个新的Knot实例,把当前绳结作为新实例的头部,再将新实例赋值给当前绳结的@tail属性,以此形成「头-尾」的链式关联——当前绳结是新绳结的跟随目标,新绳结则成为当前绳结的尾部。
2. Knot.new(self) 的工作逻辑
当调用Knot.new(self)时:
self在这里指代调用attach_tail!的那个Knot实例(比如你先创建了头部绳结head = Knot.new,再调用head.attach_tail!,此时self就是head)。- 这个
self会被传入新Knot实例的initialize方法,作为head参数的值。 - 新实例初始化时,会把自身的
@head属性设置为传入的self(也就是原绳结),同时初始位置设为[0,0],@tail暂为nil。
通过这个操作,尾部绳结就明确了自己的跟随目标,后续移动逻辑中,尾部可以通过@head引用获取头部的位置,判断是否需要移动来跟上头部。
3. 创建类实例时传入self的通用意义
在面向对象编程中,将当前实例(self)传给另一个类的构造方法,本质是建立两个实例间的关联关系,常见用途包括:
- 建立依赖/从属关系:像这个场景里,尾部绳结依赖头部的位置状态,通过持有头部的引用,尾部能实时获取头部的位置来调整自身行为。
- 构建链式结构:多次调用
attach_tail!就能生成多段绳结链(头→尾→尾→...),每一段都通过@head关联前一段。 - 实现回调/通知:一个实例可以把自己传给另一个实例,让对方在特定事件(比如头部移动)发生时通知自己,触发后续逻辑。
内容的提问来源于stack exchange,提问作者Jenny Higgins
相关产品推荐
相关产品推荐

