在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页面告诉我有关差异的信息,但我并不真正理解“名字初始化参数”是什么。这与关键字参数相同吗?
答案 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子句的顺序和顺序 每个子句中的变量。当实例化表单提供两者时 按位置和按名称参数,放置转换后的参数 在按名称参数之前。 (订单可能很重要;另见 创建对象。)