新的和实例化之间的球拍区别

时间:2017-04-23 16:39:10

标签: object racket instantiation

table-panel上,我偶然发现了对instantiate的电话。之前,在阅读Racket中的GUI文档时,我只看到new用于创建GUI类的对象。

从该页面使用instantiate

(instantiate button%
        ((format "~a" j) child)
        (stretchable-width #t)
        (stretchable-height #t)
        (callback
         (lambda (button event)
           (printf "~a~n" (send button get-label)))))

documentation的其余部分使用new

; Make a frame by instantiating the frame% class
(define frame (new frame% [label "Example"]))

两者有什么区别?

修改

我找到一个documentation页面告诉我有关差异的信息,但我并不真正理解“名字初始化参数”是什么。这与关键字参数相同吗?

1 个答案:

答案 0 :(得分:2)

(define frame (new frame% [label "Example"]))中,[label "Example"]是一个名称初始化参数,名为label的参数被赋予值"Example"。它们在概念上与关键字参数类似,但机制不同,与关键字参数不同,如果您真的想要,它们可以按位置提供。这是相关文档,来自https://docs.racket-lang.org/reference/createclass.html

  

初始化参数可以通过名称或位置提供。该   初始化变量的外部名称可以使用   实例化或使用超类初始化表单。那些形式   也接受副位论证。 make-object程序和   超类初始化过程只接受按位置参数。

     

按位置提供的参数将转换为按名称参数   使用init和init-field子句的顺序和顺序   每个子句中的变量。当实例化表单提供两者时   按位置和按名称参数,放置转换后的参数   在按名称参数之前。 (订单可能很重要;另见   创建对象。)