CachéObjectScript是一种无类型语言。不必声明变量的类型。任何变量都可以有字符串、数值或对象值。 字符串是一组字符:字母、数字、标点符号等,由一组匹配的引号 通过在字符串前面加上另一个双引号字符,可以将(双引号)字符作为文字包含在字符串中: ObjectScript字符串文字中没有其他转义字符序列。 可以使用_连接运算符将两个字符串连接成单个字符串: 过使用连接运算符,可以在字符串中包含非打印字符。以下字符串包括换行符 注:非打印字符的显示方式由显示设备决定。例如,Caché终端与换行符和其他定位字符的浏览器显示不同。此外,不同的浏览器显示定位字符 Caché编码字符串(位字符串、列表结构字符串和JSON字符串)在使用连接运算符方面有限制。 可以使用等于(=)和不等于(‘=)运算符来比较两个字符串。字符串相等比较区分大小写。使用这些运算符比较字符串和数字时要小心,因为此比较是字符串比较,而不是数字比较。因此,只有包含规范形式的数字的字符串才等于其相应的数字。(“-0”不是规范数字。) 下面的示例显示了这一点: <、>、<=或>=运算符不能用于执行字符串比较。这些运算符将字符串视为数字,并始终执行数字比较。使用这些运算符进行比较时,将为任何非数字字符串分配数值0。 字符串相等比较区分大小写。可以使用 有几个字母只有小写字母形式。例如,德语eszett( Caché支持两个最大字符串长度选项: 超过当前最大字符串长度会导致错误。 可以通过调用MaxLocalLength()方法返回当前系统范围内的最大字符串长度,如下所示: 可以使用以下任何操作在系统范围内启用或禁用长字符串: 在Caché参数文件(cpf文件)中,指定EnableLongStrings参数的值,如caché参数文件参考的EnableLongStrings部分所述。 在Config.Miscellous类属性中,指定EnableLongStrings布尔值。这将修改相应的CPF文件参数。例如: 当进程实际使用长字符串时,该字符串的内存来自操作系统的malloc()缓冲区,而不是该进程的分区内存空间。因此,分配给实际长字符串值的内存不受每个进程的最大内存(Maximum Per Process Memory(KB))参数设置的限制,也不影响进程的$STORAGE值。 位串表示具有布尔值的编号位的逻辑集合。字符串中的位从位号1开始编号。任何未显式设置为布尔值1的编号位的计算结果为0。因此,引用显式设置之外的任何编号位都会返回位值0。这些位的布尔状态只能使用位串函数 位串具有逻辑长度,它是显式设置为0或1的最高位位置。此逻辑长度只能使用 位串被存储为具有内部格式的普通 Caché 串。此内部字符串表示不能通过位串函数访问。由于这种内部格式,位串的字符串长度对于确定字符串中的位数没有任何意义。 处于相同状态(具有相同布尔值)的两个位串可能具有不同的内部字符串表示形式,因此不应在应用程序逻辑中检查或比较字符串表示形式。 由于位串的内部格式,不能将串联运算符与位串一起使用。这样做会导致 在事务回滚之后,在事务期间全局变量中设置的位将恢复为其先前的值。回滚不会将全局变量位字符串返回到其先前的字符串长度或先前的内部字符串表示形式。回滚操作不会还原局部变量。 数字文字不需要任何括起的标点符号。以使用任何有效的数字字符指定数字。Caché将一个数字计算为语法有效,然后将其转换为规范形式。 数值型文字的语法要求如下: Caché使用当前区域设置的PlusSign和MinusSign属性值来确定这些符号字符(默认情况下为“+”和“-”);这些符号字符取决于区域设置。要确定区域设置的PlusSign和MinusSign字符,请调用GetFormatItem()方法: 数字文字值不支持以下内容: 不能包含数字组分隔符。它们依赖于区域设置:美国格式使用逗号,欧洲格式使用句点。可以使用 不能包含货币符号、十六进制字母或其他非数字字符。不能包含空格,算术运算符之前或之后除外。 不能包含尾随的加号或减号。但是, 不能指定括号来将数字表示为负数。但是, 数字或数字表达式可以包含成对的括号。这些括号不是数字的一部分,但控制运算的优先顺序。默认情况下,Caché严格按照从左到右的顺序执行所有操作。 当Caché将数字转换为规范形式时,它会执行以下操作: 以下是将字符串作为数字处理的一般规则。 有关将字符串解析为数字的更多准则: 混合数字字符串是以数字字符开头,后跟一个或多个非数字字符的字符串。比如“7 dwarves”。Caché数值和布尔运算(等式运算除外)通常将此字符串解析为具有数值0(零),直到它们遇到非数字字符。此时,字符串的其余部分将被忽略。以下示例显示对混合数字字符串的算术运算: 非数字字符串是在遇到数字字符之前遇到非数字字符的任何字符串。请注意,空格被视为非数字字符。Caché数值和布尔运算(等式运算除外)通常将此字符串解析为具有数值0(零)。以下示例显示了强制相等运算的数字计算的加号: 可以使用连接运算符 Caché支持小数的两种不同表示形式: 默认情况下,Caché使用自己的浮点标准( IEEE双精度浮点标准是表示小数的行业标准方式。IEEE浮点数使用二进制表示法进行编码。 可以使用 默认情况下,Caché将小数转换为规范形式,消除所有前导零。因此,0.66变成了.66。 要在CachéObjectScript中指定科学记数法,请使用以下格式: 例如,要表示10,请使用1E1。要表示2800,请使用2.8E3。要表示0.05,请使用5e-2。 “E”运算符前面必须是数字字符或小数点,后面必须是整数,或者是单个加号或减号,然后是整数。它后面不能跟小数点、多个加号或减号或小数。允许使用前导零。不允许使用空格。 可以精确表示的最大整数是19位整数-9223372036854775808和9223372036854775807。这是因为这些是可以用64个带符号位表示的最大数字。 大于此值的整数会自动四舍五入以适应此64位限制。下面的示例显示了这一点: 类似地,大于128的指数也可导致舍入以允许在64个带符号位内表示。下面的示例显示了这一点: 由于这种四舍五入,产生大于这些19位整数的数字的算术运算将其低位数字替换为零。这可能会导致以下情况: 除了19位的舍入之外,大于308或309位的整数还会导致 以下示例显示了这一点: 可以将长度超过309位的数字表示为数字字符串。由于此值存储为字符串而不是数字,因此舍入和 会导致数字的位数超过允许的最大位数的指数会生成 对象值引用内存中对象的实例。可以将对象引用(OREF)分配给任何局部变量: 要引用对象实例的方法和属性,请使用点语法: 要确定变量是否包含对象,请使用 不能将对象值分配给全局变量。这样做会导致运行时错误。 将对象值赋给变量(或对象属性)会产生增加对象的内部引用计数的副作用,如下例所示: 当对对象的引用数量达到0时,Caché会自动销毁该对象(调用其%OnClose()方法并将其从内存中移除)。 ObjectScript变量不需要显式声明或定义。一旦为变量赋值,就会定义该变量。在第一次赋值之前,对此变量的所有引用都是未定义的。可以使用 $DATA接受一个或两个参数。只需一个参数,它就可以简单地测试变量是否有值: 在某些情况下,例如与逻辑命令或运算符一起使用时,值可能被解释为布尔值(TRUE或FALSE)。在这种情况下,如果表达式的计算结果为非零数值,则将其解释为1(TRUE),如果计算结果为零数值,则将表达式解释为0(FALSE)。数字字符串的计算结果为其数字值;非数字字符串的计算结果为0(False)。 例如,以下值被解释为TRUE: 以下值被解释为False: Caché ObjectScript没有内置的Date类型;相反,它包括许多函数,用于操作和格式化表示为字符串的日期值。 这些包括: 以下示例显示如何使用不同的日期格式:文章目录
String 字符串
("")
分隔: SET string = "This is a string" WRITE string
This is a string
转义引号
SET string = "This string has ""quotes"" in it." WRITE string
This string has "quotes" in it.
连接字符串
SET a = "Inter" SET b = "Systems" SET string = a_b WRITE string
InterSystems
($CHAR(10))
: SET lf = $CHAR(10) SET string = "This"_lf_"is"_lf_"a string" WRITE string
This is a string
$CHAR(11)
和$CHAR(12)
的方式也不同。字符串比较
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
1 0 1 0 1 0 0
字母和字符串比较
$ZCONVERT
函数将字符串中的字母转换为全部大写字母或全部小写字母进行比较。非字母字符保持不变。$CHAR(223)
)仅定义为小写字母。将其转换为大写字母会产生相同的小写字母。因此,在将字母数字字符串转换为单字母大小写时,最好始终转换为小写。长字符串
默认情况下启用长字符串。如果启用了长字符串,则字符串的最大长度为3,641,144个字符。如果禁用长字符串,则字符串的最大长度为32,767个字符。 WRITE $SYSTEM.SYS.MaxLocalLength()
3641144
ZNSPACE "%SYS" SET getstat=##class(Config.Miscellaneous).Get(.Properties) IF getstat '= 1 {WRITE "Get config property error",! QUIT} SET Properties("EnableLongStrings")=0 SET modstat=##class(Config.Miscellaneous).Modify(.Properties) IF modstat '= 1 {WRITE "Modify config property error",! QUIT}
位字符串 Bit Strings
$BIT
和$BITLOGIC
设置或访问。$BITCOUNT
函数访问,通常不应在应用程序逻辑中使用。对于位串函数,未定义的全局或局部变量等效于具有任何指定编号的位返回位值0和$BITCOUNT值0的位串。<Invalid bit string>
错误。Numbers 数字
数的基本原理
WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),! WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
+ -
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
iNumber函数删除数字组分隔符,使用‘FNUMBER`函数添加数字组分隔符。$FNUMBER
函数可以将数字显示为带有尾随符号的字符串,而$NUMBER
函数可以采用此格式的字符串并将其转换为带有前导符号的数字。$FNUMBER
函数可以将负数显示为带圆括号的字符串,$NUMBER
函数可以接受此格式的字符串,并将其转换为带有前导负号的数字。数的标准型
FNUMBER或JUSTIFY函数恢复整数零:.66变为0.66。数字形式的字符串
“3”=3
,“-2.5”=-2.5
。(请注意,-0不是规范数字。)“003”+3=6
,“++-2.5000”+-2.5=-5
。“003”>2
,“++-2.5000”>=-2.5
."003" = "003"
, "003" '= 3
, "+003" '= "003"
. WRITE "7dwarves" + 2,! // returns 9 WRITE "+24/7" + 2,! // returns 26 WRITE "7,000" + 2,! // returns 9 WRITE "7.0.99" + 2,! // returns 9 WRITE "7.5.99" + 2,! // returns 9.5
9 26 9 9 9.5
WRITE +"7" = 7,! // returns 1 (TRUE) WRITE +"+007" = 7,! // returns 1 (TRUE) WRITE +"7 dwarves" = 7,! // returns 1 (TRUE) WRITE +"dwarves" = 0,! // returns 1 (TRUE) WRITE +"" = 0,! // returns 1 (TRUE)
1 1 1 1 1
连接数字
(_)
将一个数字连接到另一个数字。Caché首先将每个数字转换为其规范形式,然后对结果执行字符串连接。因此,以下全部结果为1234
: 12_34
, 12_+34
, 12_--34
, 12.0_34
, 12_0034.0
, 12E0_34
. 串联12._34
得到1234
,但是串联12_.34
得到12.34
。连接12_-34
得到字符串12-34”
。小数
$decimal number
)表示小数。这是大多数用途的首选格式。它提供最高级别的精度-18位十进制数字。它在Caché支持的所有系统平台上都是一致的。
它们的精度为53个二进制位,相当于15.95个十进制数字的精度。(请注意,二进制表示法并不完全对应于十进制分数。) 由于大多数小数不能用此二进制记数法精确表示,因此IEEE浮点数可能与相应的标准Caché浮点数略有不同。当IEEE浮点数显示为小数时,二进制位通常被转换为具有远远多于18个十进制位的小数。这并不意味着IEEE浮点数比标准Caché小数更精确。IEEE浮点数能够表示比标准Caché数大和小的数字,并且支持特殊值INF(无穷大)和NaN(非数字)。$DOUBLE
函数将Caché标准浮点数转换为IEEE浮点数。可以使用$DECIMAL
函数将IEEE浮点数转换为Caché标准浮点数。$FNUMBER
(大多数格式)和$JUSTIFY
(3参数格式)始终返回至少包含一个整数位的小数;使用这两个函数之一,.66变为0.66。DHC-APP>w $fn(-1/1.5,"N") -0.6666666666666666667 DHC-APP>w $fn(1/1.5,"N") 0.6666666666666666667
$FNUMBER
和$JUSTUST
可用于将数字舍入或填充到指定的小数位数。Caché四舍五入。填充根据需要添加零作为小数位。将小数舍入为整数时,将删除小数分隔符。将整数补零到小数时会添加小数分隔符。科学记数法
[-]mantissaE[-]exponent
%SYSTEM.Process
类的Science Notation()
方法。极大数字
SET x=9223372036854775807 WRITE x,! SET y=x+1 WRITE y
9223372036854775807 9223372036854775810
WRITE 9223372036854775807e-128,! WRITE 9223372036854775807e-129
.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009223372036854775807 .00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000922337203685477581
SET longnum=9223372036854775790 WRITE longnum,! SET add17=longnum+17 SET add21=longnum+21 SET add24=longnum+24 WRITE add17,!,add24,!,add21,! IF add24=add21 {WRITE "adding 21 same as adding 24"}
9223372036854775790 9223372036854775807 9223372036854775810 9223372036854775810 adding 21 same as adding 24
<MAXNUMBER>
错误。取整行为也会在146或147位发生变化,具体取决于整数。DHC-APP>d ##class(PHA.TEST.ObjectScript).TestExtremelyLargeNumbersLevel() 2 digits = 11 3 digits = 111 4 digits = 1111 5 digits = 11111 6 digits = 111111 7 digits = 1111111 8 digits = 11111111 9 digits = 111111111 10 digits = 1111111111 11 digits = 11111111111 12 digits = 111111111111 13 digits = 1111111111111 14 digits = 11111111111111 15 digits = 111111111111111 16 digits = 1111111111111111 17 digits = 11111111111111111 18 digits = 111111111111111111 19 digits = 1111111111111111111 20 digits = 11111111111111111110 21 digits = 111111111111111111100 22 digits = 1111111111111111111000 23 digits = 11111111111111111110000 ... 146 digits = 11111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 147 digits = 111111111111111101270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 148 digits = 1111111111111111145800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 149 digits = 11111111111111111813000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ... 309 digits = 111111111111111116760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 310 digits = In the CATCH block System exception Name: <MAXNUMBER> Location: zTestExtremelyLargeNumbersLevel+3^PHA.TEST.ObjectScript.1 Code: 1 Data:
<MAXNUMBER>
错误都不适用: SET a="1" FOR i=1:1:360 {SET a=a_"1" WRITE i+1," characters = ",a,! }
<MAXNUMBER>
错误。允许的最大指数取决于接收指数的数字的大小。对于一位尾数,最大指数是307或308。对象
ZNSPACE "SAMPLES" SET myperson = ##class(Sample.Person).%New() WRITE myperson
6@Sample.Person
SET myperson.Name = YaoXin"
$ISOBJECT
函数: SET str = "A string" SET myperson = ##class(Sample.Person).%New() IF $ISOBJECT(myperson) { WRITE "myperson is an object.",! } ELSE { WRITE "myperson is not an object." } IF $ISOBJECT(str) { WRITE "str is an object." } ELSE { WRITE "str is not an object." }
myperson is an object. str is not an object.
SET x = ##class(Sample.Person).%New() WRITE x,! SET y = ##class(Sample.Person).%New() WRITE y,! SET z = ##class(Sample.Person).%New() WRITE z,!
6@Sample.Person 7@Sample.Person 8@Sample.Person
未定义的值
$DATA
函数来确定变量是定义的还是未定义的。 WRITE "Does ""MyVar"" exist?",! IF $DATA(MyVar) { WRITE "It sure does!" } ELSE { WRITE "It sure doesn't!" } SET MyVar = 10 WRITE !,!,"How about now?",! IF $DATA(MyVar) { WRITE "It sure does!" } ELSE { WRITE "It sure doesn't!" }
Does "MyVar" exist? It sure doesn't! How about now? It sure does!
$DATA
返回一个布尔值,如果变量有值(即包含数据),则布尔值为True(1);如果变量没有值(即不包含数据),则返回布尔值False(0)。它使用两个参数执行测试,并将第二个参数的变量设置为等于被测试变量的值:/// d ##class(PHA.TEST.ObjectScript).TestData() ClassMethod TestData() { IF $DATA(Var1,Var2) { WRITE "Var1 的值为",Var2,".",! } ELSE { WRITE "Var1 未定义.",! } SET Var1 = 3 set Var2 = 4 IF $DATA(Var1,Var2) { WRITE "Var1 的值为 ",Var2,".",! } ELSE { WRITE "Var1 未定义.",! } }
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestData() Var1 未定义. Var1 的值为 3.
布尔值
/// d ##class(PHA.TEST.ObjectScript).TestTrue() ClassMethod TestTrue() { IF 1 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF 8.5 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF "1 banana" { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF 1+1 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF -7 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF +"007"=7 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } }
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestTrue() evaluates as true evaluates as true evaluates as true evaluates as true evaluates as true evaluates as true
/// d ##class(PHA.TEST.ObjectScript).TestFalse() ClassMethod TestFalse() { IF 0 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF 3-3 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF "one banana" { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF "" { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF -0 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } IF "007"=7 { WRITE "evaluates as true",! } ELSE { WRITE "evaluates as false",! } }
DHC-APP> d ##class(PHA.TEST.ObjectScript).TestFalse() evaluates as false evaluates as false evaluates as false evaluates as false evaluates as false evaluates as false
日期
格式
描述
$HOROLOG
这是
$HOROLOG($H)
特殊变量返回的格式。它是一个包含两个逗号分隔的整数的字符串:第一个是自1840年12月31日以来的天数;第二个是自当天午夜以来的秒数。$HOROLOG
不支持小数秒。$NOW
函数提供带有小数秒的$HOROLOG
格式日期。Caché提供了许多函数,用于格式化和验证$HOROLOG
格式的日期。
ODBC Date
这是ODBC和许多其他外部表示所使用的格式。它是一个格式为“YYYY-MM-DD hh:mm:ss”的字符串。ODBC日期值将进行排序;也就是说,如果按ODBC日期格式对数据进行排序,数据将自动按时间顺序排序。
ODBC Date
这是当前区域设置使用的格式。区域设置的日期格式不同,如下所示:“美国”日期的格式为mm/dd/yyyy(日期格式1)。“欧洲”日期的格式为dd/mm/yyyy(日期格式4)。除了csyw、deuw、engw、espw、eurw、fraw、itaw、mitw、ptbw、rusw、sky、svnw、turw、ukrw之外,所有区域设置都使用日期格式4。美国日期使用句点(.)。作为小数秒的小数分隔符。欧洲日期使用逗号(,)作为小数秒的分隔符,但以下日期除外-engw,eurw,sky-使用句点。所有区域设置都使用斜杠(/)作为dateseparator字符,以下区域设置除外,它们使用句点(.)。作为日期分隔字符-捷克语(Csyw)、俄语(Rusw)、斯洛伐克语(Sky W)、斯洛文尼亚语(Svnw)和乌克兰语(Ukrw)。
System Time
这是
$ZHOROLOG($ZH)
特殊变量返回的格式。它是一个浮点数,包含系统已经运行的秒数(及其部分)。停止并重新启动caché会重置此数字。通常,此格式用于计时和测试操作。/// d ##class(PHA.TEST.ObjectScript).TestDate() ClassMethod TestDate() { SET now = $HOROLOG WRITE "当前时间和日期($H): ",now,! SET odbc = $ZDATETIME(now,3) WRITE "当前时间和日期 (ODBC): ",odbc,! SET ldate = $ZDATETIME(now,-1) WRITE "当前区域设置格式的当前时间和日期: ",ldate,! SET time = $ZHOROLOG WRITE "当前系统时间 ($ZH): ",time,! }
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestDate() 当前时间和日期($H): 65454,61669 当前时间和日期 (ODBC): 2020-03-16 17:07:49 当前区域设置格式的当前时间和日期: 03/16/2020 17:07:49 当前系统时间 ($ZH): 159353.837575
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算