2014-02-23 44 views
2

假設我有一個類的實例,在球拍中製作實例的副本?

  1. 如何做一個獨立的,相同的實例?
  2. 是否有一個簡單的語法來覆蓋此副本中的初始化參數?

事情是這樣的:

(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似乎覆蓋這些用例。

回答

1

雖然​​爲struct S,我不認爲這是對class ES任何這樣的事情。

+1

恐怕你的觀點1.是錯誤的。看到我的答案。 – Metaxal

+0

順便說一句,與列表相反,矢量也是通過在球拍中引用來處理的。 – Metaxal

+0

@Metaxal你是對的。因爲我總是使用不可變的'struct'(和''''''''''''''這並不重要,我錯了,但我錯了。哎喲。 –

2

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