在Racket中复制一个实例?

时间:2014-02-23 19:18:15

标签: object racket

假设我有一个类的实例,

  1. 如何制作一个单独的,相同的实例?
  2. 是否有一个简单的语法来覆盖此副本中的初始化参数?
  3. 这样的事情:

    (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章似乎都没有涉及这些用例。

2 个答案:

答案 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)

虽然structstruct-copy,但我认为class没有任何此类内容。