2017-04-23 30 views
0

table-panel我偶然发现了instantiate的电话。在阅读Racket的GUI文档之前,我只看到new被用来创建GUI类的对象。新的和实例化的球拍差异

instantiate从该页面使用方法:documentation其余的new

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

用法:

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

两者有什么区别?

编辑

我发现了一个documentation页告诉我不同​​,但我真的不明白“由名初始化参数”是。这与关键字参数相同吗?

回答

1

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

初始化参数可以提供的名称或位置。 初始化变量的外部名称可以与 实例化或与超类初始化形式一起使用。这些形式 也接受按位置参数。 make-object过程和超类初始化过程只接受by-position参数。

位置提供的参数使用init和init-field子句的顺序以及每个子句中的变量的顺序转换为名称参数 。当实例化表单同时提供 by-position和by-name参数时,转换后的参数在名称参数前放置为 。 (该命令可能很重要;另请参阅 创建对象。)

+0

如果我之前只知道这种参数!在Python中,就像在Racket中一样,我有时想要看到名副其实的争论,只是我不知道他们被称为什么,而且他们确实存在于Racket中。 – Zelphir