object - 在 Racket 中复制一个实例?

标签 object racket

假设我有一个类的实例,

  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 章似乎都没有涵盖这些用例。

最佳答案

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

关于object - 在 Racket 中复制一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973232/

相关文章:

racket - 相等字符串之间的差异

scheme - 在Scheme中将字符串转换为整数

javascript - 如何从对象中获取对象数组(不是值,不是字符串,不仅是键)?

具有序列号的 Java 对象

javascript - 通过类名 [JavaScript] 的 PART 获取元素

c - Racket/C FFI 中的变量函数

math - Racket /方案中的总和平方

Java NullPointerException 为什么数组为空?

javascript - 无法使用 React Context 中的变量来访问对象的值

lambda - 理解 Scheme 函数