如何通过“otherValuePtr”而不是“字节”来比较 tcl 变量

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

4我们知道Tcl_obj是一个结构体,如图所示。 例如:“set var 1, if { $var == 1 } { put "success" }" 其中“var”是一个Tcl_obj,tcl命令“==”匹配Tcl_Obj类型中的“bytes”,如果var的bytes为1,则进入{puts“success”}。但我想匹配 Tcl_Obj 结构中的“otherValuePtr”。如果 otherValuePtr 为 1,那么它将进入 { puts "success"}。我是如何实现的?

我读了./generic/tclCompile.c中的c代码,但没有结果,很伤心。

enter image description here

帮助解决这个问题。

compare tcl
1个回答
0
投票

一般来说你不能。

internalRep
字段中联合的内容(
otherValuePtr
是其中的一部分)由
typePtr
确定。当both值的类型是您完全理解的类型时(通常是因为您发布了该类型),您可以比较其中的两个。否则,比较它们的官方方法是在每个上使用
Tcl_GetStringFromObj()
来获取 UTF-8 表示并比较它们,或者要求这些值符合某些其他模型(允许失败的操作)并比较这些(例如,您对每个都执行
Tcl_GetIntFromObj()
)。如果您不是该类型的所有者,您很可能不知道如何从联合中正确提取它; Tcl 的某些类型具有相当复杂的内部模型(尤其是在 Tcl 9.0 中),并且 willdoes 会在不同版本之间更改其内部类型的实现。它们不是稳定的 API,而是实现细节。

标准建议是设计您的类型,以便从内部表示形式到字符串的转换是稳定的(通常对于列表和整数之类的东西很容易),或者内部表示形式始终从字符串派生,这样您就不需要序列化任何内容首先。

但是,如果您的代码已经拥有相关类型,那么您已经知道如何从

internalRep
字段中提取真实的内部表示以及此时如何处理它。毕竟,您需要知道这一点才能编写类型实现!您只是无法安全地对其他人类型执行此操作。

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