目录
Cache ObjectScript是一种无类型语言,不必声明变量的类型。任何变量都可以有字符串、数值或对象值。
1.字符串
- 最大字符串大小是可配置的。默认情况下启用长字符串,长字符串的最大字符串大小是3641144个字符,否则最大字符串大小为32767个字符。可在Management Portal的【系统管理】-【配置】-【系统配置】-【内存和启动】里面配置是否启用长字符串
// 输出字符串的最大长度
w $system.SYS.MaxLocalLength()
- 字符串可以包含任何字符,包括空格和控制字符。
- 字符串长度指的是字符数,而不是字节数
// 输出11
w $length("hello world")
- 可以使用$c($char缩写),来指定不可输入的字符
ClassMethod MyFunction10()
{
set str = "abc"
/// zzdump输出Ascall码
zzdump str
/// $c(0)代表空,$c(9)代表tab建(制表符),$c(10)代表换行,$c(13)代表回车
w "",!
set str = "a"_$c(0)_"bb"_$c(9)_"c"_$c(10)_"d"_$c(13)_"e"
// 输出结果为:a bb c
// d
// e
w str
}
- 如果要在字符串中包含引号字符("),则需要两个“”,两个“”代表一个”
// 输出"
w """",!
// 输出""
w """"""
set str = "hello ""world"""
// 输出hello "world"
w str
- 不包含任何值的字符串称为空字符串。它由两个引号表示。空字符串被视为已定义的值,它的长度是0。空字符串和$c(0)不同,如下所示:
ClassMethod MyFunction()
{
set str = ""
// 输出0
w "空字符串长度:"_$length(str),!
set str = $c(0)
// 输出1
w "$c(0)字符串长度:"_$length(str)
}
- 可以使用连接运算符(_)将两个或多个字符串连接在一起。
// 输出helloworld!
w "hello"_"world"_"!"
- 可以使用等于(=)和不等于('=)运算符来比较两个字符串。字符串的比较区分大小写。如果字符串为数字,则只有包含规范形式的数字的字符串才等于其相应地数字(-0不是规范数字)
ClassMethod MyFunction()
{
// 输出1
w "hello" = "hello"
// 输出0
w "world" '= "world"
// 输出0
w "-8" = 8,!
// 输出1
w "8" = 008.00,!
// 输出1
w "-8" = -8
// 输出0
w "-0" = 0,!
// 输出0
w "-0" = -0
}
- >、<、<=、或>=运算符不能用于字符串的比较。这些运算符将字符串视为数字,并始终执行数字比较。使用这些运算符进行比较时,将任何非数字字符串分配数值0
// 输出0
w "x" > 1
// 输出1
w "2x" > 1
// 输出0
w "x2x" > 1
2.数字
- 数字前面和后面可以加0
// 输出9
w 0009.00
- 字母E,用于科学计数法:
// 输出 35000000000
w 3.5E10
- 数字前面可以加+和-。但是不能出现在除了科学计数法E之外的其他字符的后面
ClassMethod MyFunction14()
{
// 输出-200
w -2E2,!
// 输出-.02
w -2E-2,!
// 输出-200
w -2E+2,!
// 输出200
w 2E+2,!
// 输出.02
w 2E-2,!
}
- Cache将数字转换为规范形式时,会将数字前面和后面的0去掉。使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
// 输出.066
w 0.066000,!
//使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
// 输出0.066
w $fn(.066, "N", 3),!
// 输出0.0660
w $justify(.066, "N", 4)
- 对于算术运算、大于/小于运算,如果字符串是规范形式的数字,则在功能上与相应地数字相同
ClassMethod Number()
{
set x = 0009.00
// 输出1
w "数字长度:"_$length(x),!
// 输出9
w "数字值:"_x,!
// 输出1
w "是否与9相等:",x=9,!
// 输出10
w "+1:",x+1,!
// 定义数字字符串
set y = "0009.00"
// 输出7
w "数字长度:"_$length(y),!
// 输出0009.00
w "数字值:"_y,!
// 输出0
w "是否与9相等:",y=9,!
// 输出10
w "+1:",y+1,!
//输出1
w "003"+3 = 6,!
//输出1
w "++-3" + -3 = -6,!
//输出1
w "003" > 2,!
//输出1
w "++-003" >= -3
}
- 混合数字字符串:指的是以数字字符开头,后面跟一个或多个非数字字符的字符串。在进行数值或布尔运算时(等式运算除外),将会从前往后匹配,如果遇到不规范非数字字符,则停止匹配,后面的字符将会被忽略。
ClassMethod Command()
{
// 输出24
w "22 hello" + 2,!
// 输出24
w "+22/77" + 2,!
// 输出24
w "22.000" + 2,!
// 输出24.5
w "22.5.99" + 2,!
// 输出24
w "22.s.8" + 2,!
}
- 非数字字符串:指的是再遇到数字字符串之前,遇到的非数字字符串的任何字符串,空格也被视为非数字字符串。数值和布尔运算通常会将非数字字符串解析为数值0
ClassMethod MyFunction()
{
// 输出1
w +"8" = 8,!
// 输出1
w +"+0008" = 8,!
// 输出1
w +"8 num" = 8,!
// 输出1
w +"num" = 0,!
// 输出1
w +"" = 0,!
}
- 可以使用连接运算符(_)将多个数字连接起来。Cache会首先将每个数字转换为其规范形式,然后对结果执行字符串连接
ClassMethod MyFunction()
{
// 输出1234
w 12_34,!
// 输出1234
w 12_+34,!
// 输出1234
w 12_--34,!
// 输出12.0134
w 12.01_34,!
// 输出.0134
w 0.01_34,!
// 输出1234.55
w 12_0034.55,!
// 输出12034
w 12E1_34,!
// 输出1212.3
w 12_"12.3"
}
3.小数
- 默认情况下,Cache使用$decimal表示浮点小数。它提供最高级别的精度,保留19位。
ClassMethod MyFunction2()
{
// 输出.3333333333333333333
w 1/3,!
// 输出.3333333333333333333
w $decimal(1/3),!
// NAN表示非数字,输出0
w $decimal("NAN"),!
// INF表示无穷大,输出0
w $decimal("INF"),!
}
- $double表示双精度浮点小数。它的精度为53个二进制位,相等于只能保证小数后16位精度。支持特殊值INF(无穷大)和NAN(非数字)
ClassMethod MyFunction3()
{
// 输出.33333333333333331482
w $double(1/3),!
// 输出NAN
w $double("NAN"),!
// 输出INF
w $double("INF"),!
}
从上面可以看出,在第17位时,开始不准确。
- Cache中,最大整数范围为:-9223372036854775808和9223372036854775807。如果对最大整数增加值,则会进行四舍五入,将低位数字替换为0
ClassMethod MyFunction4()
{
// 输出9223372036854775810
w 9223372036854775807+1,!
// 输出9223372036854775830
w 9223372036854775807+23,!
// 输出9223372036854775830
w 9223372036854775807+25,!
// 输出1
w (9223372036854775807+23)=(9223372036854775807+25),!
}
4.对象
- 通过%New命令,定义一个对象
Class Demo.Obj Extends %RegisteredObject
{
Property Name As %String;
/// d ##class(Demo.Obj).Command()
ClassMethod Command()
{
// 定义对象,将对象的引用给obj变量
set obj = ##class(Obj).%New()
// 输出15@Demo.Obj
w obj,!
}
}
- 使用$isobject判断是否为对象
// 输出1
w $isobject(obj)
// 输出0
w $isObject("123")
- 定义多个同一个对象时,会产生增加对象的内部引用计数
set obj = ##class(Obj).%New()
// 输出16@Demo.Obj
w obj,!
set obj2 = ##class(Obj).%New()
// 输出16@Demo.Obj
w obj2,!
/* 输出如下:
obj=<OBJECT REFERENCE>[15@Demo.Obj]
+----------------- general information ---------------
| oref value: 16
| class name: Demo.Obj
| reference count: 2
+----------------- attribute values ------------------
| Name = ""
+-----------------------------------------------------
*/
zw obj2
- 当对象的引用数量为0时,Cache会自动销毁该对象(调用%OnClose()方法,并将其从内存中移除)。OnClose()方法如下:
/// This callback method is invoked by the <METHOD>%Close</METHOD> method to
/// provide notification that the current object is being closed.
///
/// <P>The return value of this method is ignored.
Method %OnClose() As %Status [ Private, ServerOnly = 1 ]
{
Quit $$$OK
}
5.布尔类型
在M语言中,布尔类型为1(true)和0(false)。
ClassMethod MyFunction()
{
set num = 1
// 输出true
if (num) {
w "true",!
}else{
w "false",!
}
// 输出true
if 0.5 {
w "true",!
}else{
w "false",!
}
// 输出true
if "1 num" {
w "true",!
}else{
w "false",!
}
// 输出0
w "007"=7,!
// 输出0
w "+007"=7,!
// 输出1
w +"007"=7,!
// 输出false
if "num" {
w "true",!
}else{
w "false",!
}
}
6.日期
Global中的日期和时间都是以数字的形式存储的。
- ObjectScript没有内置的日期类型,但是它由很多函数,用于操作和格式化表示为字符串的日期值
- $horolog(缩写$h):包含了当前进程的本地日期和时间,以逗号(,)分隔。第一部分是日期的数字,它是从1840年12月31日开始计算的数字;第二部分是秒的数字,它是从午夜开始计算的。
ClassMethod MyFunction()
{
// 输出66328,46923
w $horolog,!
}
- $now:返回当前日期的本地日期和时间,以小数秒为单位
// 输出66328,51253.643677
w $now(),!
- $zdate(缩写$zd):验证日期,并将其从数字格式转换为显示指定的日期格式
- $zdateh(缩写$zdh):将日期格式转换为时间格式
$zd(日期数字,格式)->日期
$zdh(日期,格式) -> 数字
// 输出08/07/2022
w $zdate($horolog),!
// 输出2022-08-07
w $zd($horolog, 3),!
// 输出66328
w $zdateh("08/07/2022"),!
// 输出66328
w $zdh("2022-08-07", 3),!
// T表示当天, 输出66328
w $zdh("T", 5),!
- $ztime(缩写$zt):验证时间,并将其从数字格式转换为显示指定的时间格式
- $ztimeh(缩写$zth):将时间格式转换为时间格式
$zt(时间数字,格式)->时间
$zth(时间,格式) -> 数字
// 输出14:27:02
w $ztime($p($horolog, ",", 2)),!
// 输出02:27:02PM
w $zt($p($horolog, ",", 2), 3),!
// 输出52022
w $ztimeh("14:27:02"),!
// 输出52022
w $zth("02:27:02PM", 3),!
- $zdatetime(缩写$zdt):验证日期和时间,将数字转换为日期和时间
$zdt(日期和时间数字,格式)->日期和时间
$zdth(日期和时间,格式) ->日期和时间数字
// 输出08/07/2022 14:33:36
w $zdatetime($h),!
// 输出2022-08-07 14:33:36
w $zdt($h, 3),!
// 输出66328,52416
w $zdatetimeh("08/07/2022 14:33:36"),!
// 输出66328,52416
w $zdatetimeh("2022-08-07 14:33:36", 3),!
// 输出66328,0
w $zdth("T", 5),!
- $zhorolog(缩写$zh):返回启动Cache库以来,经过的秒数。
// 输出101268.602726
w $zhorolog,!
// 输出28.13016890888888889
w $zhorolog/3600,!
$zhorolog还可以用于计算程序运行的时间:
set t1 = $zh
//等待2秒钟
hang 2
set t2 = $zh
// 输出2.000593
w t2 - t1