首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向racket中的类添加类型注释

向racket中的类添加类型注释
EN

Stack Overflow用户
提问于 2021-01-22 02:10:31
回答 1查看 80关注 0票数 0

试图完成康威的生活游戏在球拍的实现,我正在添加类型的一切。我很难弄清楚到底需要做些什么才能正确地输入gui中的类。

代码语言:javascript
复制
(: 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]))

我在下面看到这个错误

代码语言:javascript
复制
/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%))时,它都说它是不绑定的。完整的文件和所有代码都可以找到这里。有人有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 21:12:53

new-timer的定义中,您试图获得cvgrd字段。

尽管cv是类new-canvas%的一个实例,但它的类型不包括该字段。您需要为Class创建一个新的new-canvas%类型。按照惯例,它应该是一个大写版本,如New-Canvas%

代码语言:javascript
复制
(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%的子类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65838410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档