为什么关键字`string`用于验证变量类型

时间:2015-08-14 10:29:54

标签: string tcl

例如,假设我们有一个名为i的变量并设置为10。要检查它是否为整数,请在tcl中设置一种类型:string is integer $i

为什么有关键字string?它与python和C ++中的含义是否相同?如何检查tcl字符串(字符序列的含义)是否为字符串? string is string $myString不起作用,因为string不是tcl中的类。

1 个答案:

答案 0 :(得分:2)

Tcl没有类型。或者更确切地说,但它们所有可序列化为字符串,并且在幕后神奇地发生;看起来它没有类型,你不应该谈论它们。 Tcl确实有类,但它们不用于原子值类型;像1.3之类的东西不是对象的实例,它只是一个值(通常是浮点类型,但它也可以是字符串或单例列表或版本标识符,甚至是命令名或变量名,如果你真的想要)。 Tcl的类定义了作为命令的对象,而那些(故意!)重量级实体。

string is系列测试检查某个值是否符合被解释为特定类型值的要求。存在很多种类的值,其中一些根本不具有类型(例如,全大写字符串)。 string is string没有任何内容,因为所有你可以询问它会自动通过; 所有 值已经是字符串,或者可以透明地转换为它们。

只有一种方法可以探测当前值的类型,即命令::tcl::unsupported::representation(仅限8.6)。这会报告当前类型的值作为其输出的一部分,并且您不应该依赖它(引擎盖下有很多类型,除非您对Tcl的实现有很多了解,否则其中许多类型都非常模糊)。

% set s 1.3
1.3
% ::tcl::unsupported::representation $s
value is a pure string with a refcount of 4, object pointer at 0x100836ca0, string representation "1.3"
% expr {$s + 3}
4.3
% ::tcl::unsupported::representation $s
value is a double with a refcount of 4, object pointer at 0x100836ca0, internal representation 0x3ff4cccccccccccd:0x0, string representation "1.3"

如您所见,类型非常灵活。你应该忽略它们。 我们的意思是。让你的代码需要它需要的类型,如果无法得到它们就抛出错误。这就是Tcl的C API为您所做的。