Racket 中 `some-struct?` 和 `#<some-struct>` 有什么区别?

问题描述 投票:0回答:1

我有一个结构

(struct client-sock-addr (host port))

我有一个

toText
功能

(define (toText.v1 addr)
  (string->chunked-string (format "<client-sock-addr ~a ~a>" (client-sock-addr-host addr) (client-sock-addr-port addr))))

执行此代码时,我收到违反合同的错误:

client-sock-addr-host: contract violation
  expected: client-sock-addr?
  given: #<client-sock-addr>
  context...:
   client-sock-addr-host

我对 Racket 比较陌生,我一直在阅读文档,但我一生都无法弄清楚

#<...>
的含义。看起来这就是当您构造该类型的实例时 REPL 吐出的内容,但是为什么该函数会失败并说它不是类型
client-sock-addr?

谢谢你。

scheme racket
1个回答
0
投票

除非它是预制结构,否则两次调用

struct
将创建两种不同的不兼容的结构类型,即使它们具有相同的名称和字段以及打印表示形式。您无法将第一个结构体的构造函数创建的值传递给第二个结构体的访问器函数,这似乎就是这里发生的情况。


#<client-sock-addr>
不可读值的示例;不透明结构(不透明或预制的结构)的默认打印表示形式,并且没有 自定义写入方法

© www.soinside.com 2019 - 2024. All rights reserved.