第三章 数据类型和值

发布时间 2023-11-24 15:09:45作者: riusky

ObjectScript 是一种无类型语言 — 您不必声明变量的类型。任何变量都可以有字符串、数字或对象值。话虽如此,在 ObjectScript 中使用不同类型的数据时需要了解一些重要信息。

Strings

字符串是一组字符:字母、数字、标点符号等,由一组匹配的引号 (") 分隔:

 SET string = "This is a string"
 WRITE string

Null String / $CHAR(0)

SET mystr="":设置 null 或空字符串。该字符串已定义,长度为零,并且不包含任何数据:

  SET mystr=""
  WRITE "defined:",$DATA(mystr),!
  WRITE "length: ",$LENGTH(mystr),!
  ZZDUMP mystr

SET mystr=$CHAR(0):将字符串设置为空字符。字符串已定义,长度为 1,包含单个字符,十六进制值为 00:

  SET mystr=$CHAR(0)
  WRITE "defined:",$DATA(mystr),!
  WRITE "length: ",$LENGTH(mystr),!
  ZZDUMP mystr

SET mystr=$CHAR(0):将字符串设置为空字符。字符串已定义,长度为 1,包含单个字符,十六进制值为 00:

  SET mystr=$CHAR(0)
  WRITE "defined:",$DATA(mystr),!
  WRITE "length: ",$LENGTH(mystr),!
  ZZDUMP mystr
  • 请注意,这两个值并不相同。但是,位串将这些值视为相同。
  • 请注意,InterSystems SQL 对这些值有自己的解释;请参阅 NULL 和空字符串。

您可以在字符串中包含一个“(双引号)字符作为文字,方法是在它前面加上另一个双引号字符:

 SET string = "This string has ""quotes"" in it."
 WRITE string

Concatenating Strings 连接字符串

您可以使用连接运算符将两个字符串连接成一个字符串:

 SET a = "Inter"
 SET b = "Systems"
 SET string = a_b
 WRITE string

通过使用连接运算符,您可以在字符串中包含非打印字符。以下字符串包含换行符 ($CHAR(10)) 字符:

 // $CHAR(10) 这个是回车 换行符号
 SET lf = $CHAR(10)
 SET string = "This"_lf_"is"_lf_"a string"
 WRITE string

String Comparisons 字符串比较

您可以使用等于 (=) 和不等于 ('=) 运算符来比较两个字符串。字符串相等比较区分大小写。

使用这些运算符将字符串与数字进行比较时请务必小心,因为此比较是字符串比较,而不是数字比较。因此,只有包含规范形式的数字的字符串才等于其对应的数字。 (“-0”不是规范数字。)这如以下示例所示:

  WRITE "Fred" = "Fred",!  // TRUE
  WRITE "Fred" = "FRED",!  // FALSE
  WRITE "-7" = -007.0,!    // TRUE
  WRITE "-007.0" = -7,!    // FALSE
  WRITE "0" = -0,!         // TRUE
  WRITE "-0" = 0,!         // FALSE
  WRITE "-0" = -0,!        // FALSE

<、>、<= 或 >= 运算符不能用于执行字符串比较。这些运算符将字符串视为数字并始终执行数字比较。使用这些运算符进行比较时,任何非数字字符串都会被分配数值 0。

字母大小写和字符串比较

字符串相等比较区分大小写。您可以使用 $ZCONVERT 函数将要比较的字符串中的字母转换为全部大写字母或全部小写字母。非字母字符不变。

少数字母只有小写字母形式。例如,德语 eszett ($CHAR(223)) 仅定义为小写字母。将其转换为大写字母会产生相同的小写字母。

因此,在将字母数字字符串转换为单个字母大小写时,最好始终转换为小写字母。

位串

位串表示具有布尔值的编号位的逻辑集合。字符串中的位从位号 1 开始编号。任何未显式设置为布尔值 1 的编号位均计算为 0。因此,引用超出显式设置的任何编号位将返回位值 0。

  • 位值只能使用位串函数 $BIT 和 $BITLOGIC 设置。

  • 位值只能使用位串函数 $BIT 、 $BITLOGIC 和 $BITCOUNT 访问。

  • 位串具有逻辑长度,即显式设置为 0 或 1 的最高位位置。此逻辑长度只能使用 $BITCOUNT 函数访问,通常不应在应用程序逻辑中使用。对于位串函数来说,未定义的全局或局部变量相当于任何指定编号位返回位值 0 且 $BITCOUNT 值为 0 的位串。

  • 位字符串存储为具有内部格式的普通 ObjectScript 字符串。此内部字符串表示形式无法使用位串函数访问。由于这种内部格式,位串的串长度对于确定串中位数没有任何意义。

  • 由于位串内部格式的原因,您不能将连接运算符与位串一起使用。尝试这样做会导致 </>INVALID BIT STRING</> 错误。

  • 处于相同状态(具有相同布尔值)的两个位串可能具有不同的内部字符串表示形式,因此不应在应用程序逻辑中检查或比较字符串表示形式。

  • 对于位串函数来说,指定为未定义变量的位串相当于所有位均为 0、长度为 0 的位串。

  • 与普通字符串不同,位字符串将空字符串和字符 $CHAR(0) 视为彼此等效并表示 0 位。这是因为 $BIT 将任何非数字字符串视为 0。因此:

  SET $BIT(bstr1,1)=""
  SET $BIT(bstr2,1)=$CHAR(0)
  SET $BIT(bstr3,1)=0
  IF $BIT(bstr1,1)=$BIT(bstr2,1) {WRITE "bitstrings are the same"} ELSE {WRITE "bitstrings different"}
  WRITE $BITCOUNT(bstr1),$BITCOUNT(bstr2),$BITCOUNT(bstr3) 
  • 事务期间全局变量中设置的位将在事务回滚后恢复为之前的值。但是,回滚不会将全局变量位字符串返回到其先前的字符串长度或先前的内部字符串表示形式。回滚操作不会恢复局部变量。

  • 逻辑位图结构可以由位串数组表示,其中数组的每个元素表示具有固定位数的“块”。

  • 由于 undefined 相当于全 0 位的块,因此数组可以是稀疏的,其中表示全 0 位的块的数组元素根本不需要存在。

  • 因此,并且由于上述回滚行为,应用程序逻辑应避免依赖于位字符串的长度或使用 $BITCOUNT(str) 或 $BITCOUNT(str,0) 可访问的 0 值位的计数。

Numbers

// TODO 

数字基础知识