gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:50:31 27 4
gpt4 key购买 nike

假设我有一个类的实例,

  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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com