假设我有一个类的实例,
这样的事情:
(define a (new A% [:x 1] [:y 2] )) ;; A's have two fields initiaized at construction
(define b (copy a)) ;; just make an independent copy
(define c (copy a [:y 4])) ;; copy but override one (or more) initialization argument.
在线文档的第6章和第13章似乎都没有涉及这些用例。
答案 0 :(得分:4)
define
不会复制类实例,只会复制引用,就像结构一样。例如:
#lang racket
(define A%
(class object%
(init-field a)
(super-new)))
(define a1 (new A% [a 6]))
(define a2 a1)
(get-field a a1) ; 6
(get-field a a2) ; 6
(set-field! a a2 2)
(get-field a a2) ; 2
(get-field a a1) ; 2
这意味着(define a2 a1)
实际上复制了引用,就像结构一样。
为类创建副本的常用方法是实现clone
方法(可以在子类中进行优化)。然后很容易有默认参数:
#lang racket
(define B%
(class object%
(init-field b)
(define/public (clone #:b [b b])
(new B% [b b]))
(super-new)))
(define b1 (new B% [b 3]))
(define b2 (send b1 clone))
(define b3 (send b1 clone #:b 5))
(get-field b b1) ; 3
(get-field b b2) ; 3
(get-field b b3) ; 5
(set-field! b b1 4)
(get-field b b1) ; 4
(get-field b b2) ; 3
(get-field b b3) ; 5
答案 1 :(得分:2)
虽然struct
有struct-copy
,但我认为class
没有任何此类内容。