如何解决向球拍中的类添加类型注释
尝试在 Racket 中完成康威生命游戏的实现,我正在为所有内容添加类型。我无法弄清楚我到底需要做什么才能从正确键入的 gui lib 中获取类。
(: new-timer (Instance Timer%))
(define new-timer (new timer% [interval 400]
[notify-callback (lambda () (begin
(set-field! Grd cv (next-grid (get-field Grd cv) ROW COLUMNS))
(send cv on-paint)))]))
(: new-canvas% Canvas%)
(define new-canvas% (class canvas%
(super-new)
(inherit get-dc suspend-flush resume-flush)
(field [dc : (Instance DC<%>) (get-dc)] [Grd : Grid (make-grid ROW COLUMNS)])
(define/override (on-char char)
(let ([event (send char get-key-code)])
(cond
[(and (char? event) (char=? event #\space)) (send new-timer stop)])))
(define/override (on-paint)
(send dc erase)
(suspend-flush)
(render-grid Grd ROW COLUMNS dc)
(resume-flush))))
(: cv (Instance Canvas%))
(define cv (new new-canvas% [parent main-frame]))
我在下面收到此错误
/Documents/conways-game-of-life/main.rkt:49:83: Type Checker: type mismatch;
; the object is missing an expected field
; field: Grd
; object type: (Instance Canvas%)
; in: (get-field Grd cv)
; Context:
; /usr/share/racket/collects/racket/promise.rkt:128:5
; /home/diego/Documents/conways-game-of-life/main.rkt:49:53: Type Checker: type mismatch;
; expected an object with field Grd
; given: (Instance Canvas%)
; in: (set-field! Grd cv (next-grid (get-field Grd cv) ROW COLUMNS))
我认为这是因为画布通常没有 Grd 字段,但是每次我尝试为画布提供类型声明 (: cv (Instance new-canvas%))
时,它都说它是未绑定的。可以找到完整的文件和所有代码 here。有人有什么想法吗?
解决方法
在 new-timer
的定义中,您试图获取 grd
的 cv
字段。
虽然 cv
是类 new-canvas%
的实例,但其类型不包括该字段。您需要为 Class
创建一个新的 new-canvas%
类型。按照惯例,它应该是大写的版本,如 New-Canvas%
。
(define-type New-Canvas% (Class ....))
(: new-canvas% New-Canvas%)
(define new-canvas% (class ....))
(: cv (Instance New-Canvas%))
(define cv (new .....))
您使用 New-Canvas%
定义的 Class
类型应指定新字段 grd
,并指定它是 Canvas%
的子类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。