文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
2.1 Self 是什么?
回过头看看最初那个对象的定义(没有宏的那个)。对象是函数;所以我们想要的是在这个函数范围内能够引用自己。该怎么做呢?研究递归的时候我们已经知道答案了!只需使用递归绑定(letrec)给函数—对象命名,然后就可以在方法定义中使用了:
(define point
(letrec ([self
(let ([x 0])
(let ([methods (list (cons 'x? (λ () x))
(cons 'x! (λ (nx)
(set! x nx)
self)))])
(λ (msg . args)
(apply (cdr (assoc msg methods)) args))))])
self))
请注意,letrec 的主体就返回 self,它绑定到我们定义的递归子程序。
> ((point 'x! 10) 'x?)
10
在 Smalltalk 语言中,方法默认返回 self。
请注意,赋值方法 x!
返回 self,这使得我们可以链式传递消息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论