微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向球拍中的类添加类型注释

如何解决向球拍中的类添加类型注释

尝试在 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 的定义中,您试图获取 grdcv 字段。

虽然 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 举报,一经查实,本站将立刻删除。