假设我有一个类的实例,
像这样的东西:
(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.
Run Code Online (Sandbox Code Playgroud)
在线文档的第 6 章和第 13 章似乎都没有涵盖这些用例。
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
Run Code Online (Sandbox Code Playgroud)
这意味着(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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
775 次 |
| 最近记录: |