返回介绍

4.5 词法作用域和委托

发布于 2025-02-20 00:17:07 字数 1081 浏览 0 评论 0 收藏 0

正如之前所讨论的,在我们的系统中可以定义 嵌套的对象 。词法嵌套与委托之间的关系蛮有意思的,值得讨论一下。考虑下面的例子:

(define parent
 (OBJECT-DEL root ()
   ([method foo () 1])))

(define outer
 (OBJECT-DEL root
    ([field foo (λ () 2)])
    ([method foo () 3]
     [method get ()
             (OBJECT-DEL parent ()
                ([method get-foo1 () (foo)]
                 [method get-foo2 () (-> self foo)]))])))

(define inner (-> outer get))

> (-> inner get-foo1)
2
> (-> inner get-foo2)
1

可以看到,自由标识符在词法环境中查找(见 get-foo1 ),未知消息在委托链上进行查找(见 get-foo2 )。这点需要澄清,因为 Java 程序员习惯的是 this.foo() 等同于 foo() 。在许多同时支持词法嵌套和某种形式的委托(如继承)的语言中,情况并非如此。

其他语言对此有不同的处理。参见 Newspeak 和 AmbientTalk。

Java 是怎么处理的? 试试就知道了!继承链屏蔽(shadow)了词法链:使用 foo() 时,如果能在超类中找到方法,则会调用该方法;只有在找不到方法时,才使用词法环境(即 outer 对象中的 foo )。因此,对 outer 对象的引用是非常脆弱的。这就是为什么 Java 支持额外的语法形式 Outer.this 来引用外层对象。当然,如果直接外层对象的类中找不到方法,那么就继续在它的超类中查找,而不是往词法链上。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文