文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.2 访问字段
当然,这个定义不怎么通用,因为它只适用于一个字段 x
。我们需要将其一般化:字段名必须作为参数传给 -read
和 -write
消息。问题是,如何用字段名(符号)访问对象的词法环境中的同名变量。一个简单的解决方案是使用某种结构来保存字段值。方法的定义就是这样处理的,保存的是方法名称和方法定义之间的关联。不过,与方法表不同,字段绑定是(至少是潜在)可变的。Racket 不支持对关联表进行赋值,所以我们使用字典(更确切地说,哈希表),用 dict-ref
和 dict-set!
访问。
(define make-point
(let ([methods (list (cons 'x? (λ (self)
(λ () (self '-read 'x))))
(cons 'x! (λ (self)
(λ (nx)
(self '-write 'x nx)
self))))])
(λ (init-x)
(letrec ([self
(let ([fields (make-hash (list (cons 'x init-x)))])
(λ (msg . args)
(case msg
[(-read) (dict-ref fields (first args))]
[(-write) (dict-set! fields (first args)
(second args))]
[else
(apply ((cdr (assoc msg methods)) self) args)])))])
self))))
> (let ((p1 (make-point 1))
(p2 (make-point 2)))
(+ ((p1 'x! 10) 'x?)
(p2 'x?)))
12
请注意 make-point
现在保存了方法定义的列表,还有,被创建的对象捕获了 fields
(字段) 字典(该字典先初始化,然后返回给对象)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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