目录
5.4 continue命令、quit命令和return命令的区别
- WRITE "hello"
- write "hello"
- W "hello"
- w "hello"
- ClassMethod MyFunction()
- {
- set write = "hello"
- //输出hello
- w write
- }
条件命令 | if eiseif else |
循环命令 | do while for while |
调用命令 | do goto job xecute |
退出命令 | continue quit return |
赋值命令 | new:为变量赋值建立新的上下文 kill:删除变量 merge:将全局变量节点或多维数组合并到目标变量 set:为变量赋值 zkill:删除节点,同时保留该节点的子代 |
输出命令 | write zwrite zzdump zzwrite |
异常命令 | try catch throw ztrap |
事务命令 | tcommit trollback tstart |
调试命令 | break zbreak |
IO命令 | close open read use |
挂起命令 | hang halt |
其他命令 | lock view znspace |
例程命令 | zprint zinsert zload zremovve zsave zzprint |
- ClassMethod MyFunction()
- {
- //为单个变量赋值
- set x = "x"
- //为多个变量赋值
- set y = "y", z = "z", a = "a"
- }
set (x, y, z, a) = "hello"
- ClassMethod MyFunction()
- {
- //赋值JSON对象
- set json = {"name":"小明", "age":"12"}
- //输出{"name":"小明","age":"12"}
- w json.%ToJSON(),!
-
- //赋值JSON数组
- set json = ["小明", 12]
- //输出["小明",12]
- w json.%ToJSON(),!
-
- //嵌套JSON
- set json = {"name":"小明", "age":"12", "address":{"code":"1"}}
- //输出{"name":"小明","age":"12","address":{"code":"1"}}
- w json.%ToJSON(),!
- }
- ClassMethod MyFunction()
- {
- set str = "a^b^c^d^e"
- set $piece(str, "^") = "xyz"
- //输出xyz^b^c^d^e
- w str
-
- set str = "abcde"
- set $extract(str) = "xyz"
- //输出xyzbcde
- w str
- }
- ClassMethod MyFunction()
- {
- set x = 1, y = 2, z = 3
- kill x
- kill y, z
-
- //输出a=0 b=0 c=0
- w "a=",$d(a), " b=",$d(b), " c=",$d(c)
- }
- ClassMethod MyFunction()
- {
- kill a, ^b, ^||c
-
- set a = "a", a(1) = "a1", a(2) = "a2"
- set a(1,1) = "a11", a(1,1,1)="a111"
-
- set ^b = "^b", ^b(1) = "^b1", ^b(2) = "^b2"
- set ^b(1,1) = "^b11", ^b(1,1,1)="^b111"
-
- set ^||c = "^||c", ^||c(1) = "^||c1", ^||c(2) = "^||c2"
- set ^||c(1,1) = "^||c11", ^||c(1,1,1)="^||c111"
-
- w "kill之前",!
- zw a, ^b, ^||c
- kill a(1), ^b(1,1), ^||c(1)
- w "kill之后",!
- zw a, ^b, ^||c
- }
输出如下所示:
kill之前
a="a"
a(1)="a1"
a(1,1)="a11"
a(1,1,1)="a111"
a(2)="a2"
^b="^b"
^b(1)="^b1"
^b(1,1)="^b11"
^b(1,1,1)="^b111"
^b(2)="^b2"
^||c="^||c"
^||c(1)="^||c1"
^||c(1,1)="^||c11"
^||c(1,1,1)="^||c111"
^||c(2)="^||c2"
kill之后
a="a"
a(2)="a2"
^b="^b"
^b(1)="^b1"
^b(2)="^b2"
^||c="^||c"
^||c(2)="^||c2"
- ClassMethod MyFunction()
- {
- set a=1 ,b=2, c=3
- kill (a,c)
-
- //输出a=1 b=0 c=1
- w "a=",$d(a)," b=",$d(b)," c=",$d(c)
- }
- ClassMethod MyFunction()
- {
- set ^color(1) = "red"
- set ^||color(1) = "black"
-
- set a=1, b=2
- w "kill之前",!
- kill
- w "kill之后",!
-
- //输出a=0 b=0
- w "a=",$d(a)," b=",$d(b),!
- //输出^color(1)="red"
- zw ^color
- //输出^||color(1)="black"
- zw ^||color
- }
①按值传递变量:kill对按值传递的变量不会起任何效果。
- ClassMethod MyFunction()
- {
- set x = "1"
- //输出调用Sub之前x是否存在:1
- w "调用Sub之前x是否存在:",$data(x),!
- d ##class(User.Test).Sub(x)
-
- //输出调用Sub之后x是否存在:1
- w "调用Sub之后x是否存在:",$data(x),!
- }
-
- ClassMethod Sub(x)
- {
- //输出kill之前,x是否存在:1
- w "kill之前,x是否存在:",$data(x),!
- kill x
- //输出kill之后,x是否存在:0
- w "kill之后,x是否存在:",$data(x),!
- }
②按引用传递变量:kill会删除按引用传递的变量
- ClassMethod MyFunction()
- {
- set x = "1"
- //输出调用Sub之前x是否存在:1
- w "调用Sub之前x是否存在:",$data(x),!
- d Sub(.x)
-
- //输出调用Sub之后x是否存在:0
- w "调用Sub之后x是否存在:",$data(x),!
-
- Sub(&x)
- //输出kill之前,x是否存在:1
- w "kill之前,x是否存在:",$data(x),!
- kill x
- //输出kill之后,x是否存在:0
- w "kill之后,x是否存在:",$data(x),!
- }
- }
- ClassMethod MyFunction()
- {
- kill a, ^b, ^||c
-
- set a = "a", a(1) = "a1", a(2) = "a2"
- set a(1,1) = "a11", a(1,1,1)="a111"
-
- set ^b = "^b", ^b(1) = "^b1", ^b(2) = "^b2"
- set ^b(1,1) = "^b11", ^b(1,1,1)="^b111"
-
- set ^||c = "^||c", ^||c(1) = "^||c1", ^||c(2) = "^||c2"
- set ^||c(1,1) = "^||c11", ^||c(1,1,1)="^||c111"
-
- w "kill之前",!
- zw a, ^b, ^||c
- zkill a(1), ^b(1,1), ^||c(1)
- w "kill之后",!
- zw a, ^b, ^||c
- }
运行结果如下所示:
kill之前
a="a"
a(1)="a1"
a(1,1)="a11"
a(1,1,1)="a111"
a(2)="a2"
^b="^b"
^b(1)="^b1"
^b(1,1)="^b11"
^b(1,1,1)="^b111"
^b(2)="^b2"
^||c="^||c"
^||c(1)="^||c1"
^||c(1,1)="^||c11"
^||c(1,1,1)="^||c111"
^||c(2)="^||c2"
kill之后
a="a"
a(1,1)="a11"
a(1,1,1)="a111"
a(2)="a2"
^b="^b"
^b(1)="^b1"
^b(1,1,1)="^b111"
^b(2)="^b2"
^||c="^||c"
^||c(1,1)="^||c11"
^||c(1,1,1)="^||c111"
^||c(2)="^||c2"
new命令会创建一个新的局部变量上下文。它在旧的上下文中保留现有的局部变量值,然后启动一个新的上下文,在新的上下文中没有为局部变量赋值。
在程序中,一般使用new初始化整个应用程序或应用程序的主要子系统的变量。
NEW | 为所有局部变量启动新的上下文 |
NEW x, y, z... | 为指定的局部变量(x, y, z,,,)启动新的上下文 |
NEW(x, y, z...) | 1.也称为独占new 2.为除了指定变量(x, y, z...)之外的所有局部变量启动新的上下文 3.括号里面的变量最多可以指定255个 |
1.Globals全局变量
2.Process-Private Globals私有进程全局变量
3.局部变量下标
4.一些特殊变量,$ESTACK、$ETRAP、$NAMESPACE和$ROLES除外
- Class User.Test3 Extends %RegisteredObject [ Not ProcedureBlock ]
- {
- ...
- }
①使用new命令初始化所有变量
- ClassMethod MyFunction()
- {
- set a=1, b=2, c=3
- w "new 之前",!
- zw
- new
- w "new 之后",!
- zw
- }
-
- 程序运行结果如下:
- new 之前
- a=1
- b=2
- c=3
- new 之后
②使用new命令初始化指定变量
- ClassMethod MyFunction()
- {
- set a=1, b=2, c=3, d=4
- w "new 之前",!
- zw
- new b, d
- w "new 之后",!
- zw
- }
-
- 程序运行结果如下:
- new 之前
- a=1
- b=2
- c=3
- d=4
- new 之后
- a=1
- c=3
③使用new命令初始化除了指定变量之外的全部变量
- ClassMethod MyFunction()
- {
- set a=1, b=2, c=3, d=4
- w "new 之前",!
- zw
- new (b, d)
- w "new 之后",!
- zw
- }
- 程序运行结果如下:
- new 之前
- a=1
- b=2
- c=3
- d=4
- new 之后
- b=2
- d=4
- ClassMethod MyFunction()
- {
- for i=1 : 1 : 32{
- new (i)
- }
- }
-
- 运行报错:Error
Merge命令将全部变量或者多维数组节点复制到指定变量。
- ClassMethod MyFunction25()
- {
- kill ^x, ^y
- set ^x(2,2) = "x22"
- set ^x(2,2,4) = "x224"
- set ^y(3,6,7) = "y367"
- set ^y(3,6,8) = "y368"
- set ^y(3,6,7,8,4) = "y36784"
- set ^y(3,6,7,8,9) = "y36789"
-
- merge ^x(2,3) = ^y(3,6,7,8)
- zw ^x
- zw ^y
- }
-
- 程序运行结果:
- ^x(2,2)="x22"
- ^x(2,2,4)="x224"
- ^x(2,3,4)="y36784"
- ^x(2,3,9)="y36789"
- ^y(3,6,7)="y367"
- ^y(3,6,7,8,4)="y36784"
- ^y(3,6,7,8,9)="y36789"
- ^y(3,6,8)="y368"
图示如下:
复制后^x为:
条件命令包含:if命令、elseif命令和else命令。
- ClassMethod MyFunction()
- {
- set x = 10
-
- if x = 1{
- w "1"
- }elseif(x = 2){
- w "2"
- }elseif(x = 3){
- w "3"
- }else{
- w "其他"
- }
- }
如下所示,传统的if命令:
- ClassMethod MyFunction()
- {
- set x= 1
- if x=1 w "进入if",! d Sub1(x)
- else w "进入else",! d Sub2(x)
- q
-
- Sub1(num)
- w "$TEST=",$TEST,!
- if num=2
- w "$TEST=",$TEST,!
- w "进入Sub1",!
- q
- Sub2(num)
- w "进入Sub2",!
- q
- }
-
- 运行结果:
- 进入if
- $TEST=1
- $TEST=0
- 进入Sub1
- 进入else
- 进入Sub2
如果去掉Sub1里面的if num=2,则运行结果如下:
进入if
$TEST=1
$TEST=1
进入Sub1
- ClassMethod MyFunction()
- {
- set x = 3
- if x#2 = 0{
- w "偶数"
- q
- w "if退出"
- }else{
- w "奇数"
- q
- w "else退出"
- }
- w "此处永远不会执行"
- }
-
- 程序运行结果:
- 奇数
- ClassMethod MyFunction()
- {
- for x=1 : 1 :8{
- if x#2 = 0{
- w "偶数",!
- }else{
- w "奇数",!
- q:x=3
- }
- }
- w "循环执行完成"
- }
-
- 程序运行结果:
- 奇数
- 偶数
- 奇数
- 循环执行完成
- ClassMethod MyFunction()
- {
- try{
- set x = 2
- if x#2 = 0{
- w "偶数",!
- q
- w "退出if"
- }else{
- w "奇数",!
- q
- w "退出else"
- }
- w "此处永远不会执行"
- }catch ex{
- w "当程序发生错误时执行"
- w "Error Name:",$zcvt(ex.name, "O", "HTML"),!
- }
- w "执行完try catch"
- }
-
- 程序运行结果:
- 偶数
- 执行玩try catch
如果在条件命令中使用goto,要注意死循环
- ClassMethod MyFunction6()
- {
- set x = 1
-
- Loop
- if x >= 1{
- w "无限循环",!
- set x = x + 1
- goto Loop
- }
- }
程序会一直打印:无限循环
包含:do while、for、while命令
- Class Demo.Test1 Extends %RegisteredObject
- {
- ClassMethod MyFunction(x)
- {
- for{
- w "x=",x,!
- set x = x - 1
- q:(x = 2)
- }
- q "结束"
- }
- }
执行w ##class(Demo.Test1).MyFunction(3),运行结果如下:
x=3
结束
执行w ##class(Demo.Test1).MyFunction(2),会一直循环运行,如下:
x=2
x=1
x=-1
x=-2
...
- ClassMethod MyFunction(x)
- {
- try{
- for{
- set y = 2 / x
- w "2/",x,"=",y,!
- set x = x - 1
- }
- }catch e{
- w "程序执行发生错误",!
- if 1 = e.%IsA("%Exception.SystemException"){
- w "Name:",e.Name,!
- w "Location:",e.Location,!
- w "Code:",e.Code,!
- }else{
- w "其他异常",!
- }
- }
- }
执行w ##class(Demo.Test1).MyFunction(3),运行结果如下:
2/3=.6666666666666666667
2/2=1
2/1=2
程序执行发生错误
Name:
Location:zMyFunction2+3^Demo.Test1.1
Code:18
- ClassMethod MyFunction()
- {
- for x = 1{
- w "x=",x,!
- }
-
- for color = "red","orange","yellow"{
- w "color =",color ,!
- }
- }
- 运行结果如下:
- x=1
- color=red
- color=orange
- color=yellow
- ClassMethod MyFunction()
- {
- set str = "hello world"
- set len = $length(str)
- for i=1 : 1 : len{
- w i," ",$extract(str, i),!
- }
- }
- 程序运行结果:
- 1 h
- 2 e
- 3 l
- 4 l
- 5 o
- 6
- 7 w
- 8 o
- 9 r
- 10 l
- 11 d
- ClassMethod MyFunction()
- {
- for i(1) = 0 : 3{
- //如果长度等于2就退出
- q:$length(i(1))=2
- w i(1),!
- }
- }
- 程序运行结果:
- 0
- 3
- 6
- 9
- ClassMethod MyFunction()
- {
- set color(1) = "red"
- set color(2) = "orange"
- set color(3) = "blue"
-
- set id = ""
-
- //方式一:点语法
- for set id = $o(color(id)) q:(id = "") d
- .w "点语法:",color(id),!
-
- //方式二:块语法
- for{
- set id = $o(color(id))
- q:(id = "")
- w "块语法:",color(id),!
- }
- }
运行结果为:
点语法:red
点语法:orange
点语法:blue
块语法:red
块语法:orange
块语法:blue
注意事项:如果方式一点语法的for命令中,set id=$o(color(id))如果写成id=$o(color(id))的话,for循环只会运行一次,即运行结果为->点语法:red
- ClassMethod MyFunction()
- {
- set x = 1
- while x < 3{
- w x,!
- set x = x + 1
- }
- }
- 程序运行结果:
- 1
- 2
- ClassMethod MyFunction()
- {
- set x = 1
-
- do{
- w x,!
- set x = x + 1
- }while (x < 2)
- }
- 程序运行结果:
- 1
注意事项:程序会先do,然后再进入while判断,所以说程序会至少执行一次
退出命令包含:continue、quit和return命令
- ClassMethod MyFunction()
- {
- for i=1 : 1 : 3{
- continue:i=2
- w i,!
- }
- }
- 运行结果:
- 1
- 3
- ClassMethod MyFunction()
- {
- w "在主程序中",!
- d sub
- w "返回主程序",!
- q
- w "程序终止"
- sub
- w "在sub中",!
- for i=1 : 1 : 5{
- w "i=",i,!
- if i=3 q
- }
- w "停止循环",!
- q
- w "sub退出",!
- }
- 程序运行结果:
- 在主程序中
- 在sub中
- i=1
- i=2
- i=3
- 停止循环
- 返回主程序
- ClassMethod MyFunction()
- {
- for i=1 : 1 : 3 d
- //quit相当于退出本次的do结构,并不会退出循环
- .q:i=2
- .w "点语法i=",i,!
-
- for i=1 : 1 : 3{
- continue:i=2
- w "块语法i=",i,!
- }
- }
- 程序运行结果:
- 点语法i=1
- 点语法i=3
- 块语法i=1
- 块语法i=3
- ClassMethod MyFunction()
- {
- w "在主程序中",!
- d sub
- w "返回主程序",!
- return
- w "程序终止"
- sub
- w "在sub中",!
- for i=1 : 1 : 5{
- w "i=",i,!
- if i=3 return
- }
- w "停止循环",!
- return
- w "sub退出",!
- }
- 程序运行结果:
- 在主程序中
- 在sub中
- i=1
- i=2
- i=3
- 返回主程序
- ClassMethod MyFunction()
- {
- for i=1 : 1 : 3 d
- .ret:i=2
- .w "点语法i=",i,!
-
- for i=1 : 1 : 3{
- ret:i=2
- w "块语法i=",i,!
- }
- }
- 程序运行结果:
- 点语法i=1
- 点语法i=3
- 块语法i=1
continue | 退出本次循环,继续下一次循环 |
quit | 退出循环 |
return | 退出循环,并结束当前运行方法(例程或程序) |
块语法中,return可以直接退出并返回值 |
点语法中,则需要在循环外定义一个变量,去接受并判断,才能返回值 |
- /// w ##class(User.Test4).MyFunction1(1)
- ClassMethod MyFunction17(x)
- {
- //定义一个变量,接收返回值
- set err = 0
- for i=1 : 1 : 3 q:err d
- .w "i=",i,!
- .s err = ..Return(x)
-
- q:err "程序错误"
- q "程序正确"
- }
-
- /// w ##class(User.Test4).MyFunction2(1)
- ClassMethod MyFunction18(x)
- {
- for i=1 : 1 : 3{
- w "i=",i,!
- ret:..Return(x) "程序错误"
- }
- q "程序正确"
- }
-
- /// 1代表错误,0代表正确
- ClassMethod Return(x) As %Boolean
- {
- quit x
- }
运行w ##class(User.Test4).MyFunction1(1),结果如下:
i=1
程序错误
运行w ##class(User.Test4).MyFunction1(0),结果如下:
i=1
i=2
i=3
程序正确
位置 | quit | return |
方法或例程代码(非块结构) | 退出方法或例程,返回到调用方法或例程 | 退出方法或例程,返回到调用方法或例程 |
try或catch块 | 退出方法或例程,返回到调用方法或例程 | |
do或者xecute | 退出方法或例程,返回到调用方法或例程 | 退出方法或例程,返回到调用方法或例程 |
if | 退出方法或例程,返回到调用方法或例程。 如果嵌套在循环命令中,则退出循环,继续执行循环代码块后面代码 | 退出方法或例程,返回到调用方法或例程 |
for、while、do while | 则退出循环,继续执行循环代码块后面代码 | 退出方法或例程,返回到调用方法或例程 |
输出命令包含:write、zwrite、zzdump和zzwrite命令。
显示输出内容到当前设备
1)后置表达式(可选)
- // 输出空
- w:(1>3) 1
-
- // 输出3
- w:(3>1) 3
2)有参数的write
write + 表达式(任何有效的ObjectScript表达式,包括文字、变量、对象方法和对象属性),输出结果均为数字或带引号的字符串
- // 输出3
- w 1+2
- // 输出ab
- w "a"_"b"
3)无参的write
- 变量1 = 变量1值
- 变量2 = 变量2值
如下所示:
- /// w ##class(User.Test4).MyFunction19()
- ClassMethod MyFunction19()
- {
- set str1 = "red"
- set str2 = +123.40
- set str3 = "456.7"
- set str4 = "456.0"
- set str5 = "-999"
- w
- }
输出如下:
str1="red"
str2=123.4
str3=456.7
str4="456.0"
str5=-999
注意:小数以0结尾的字符串,会被认为是字符串,如str4
输出变量名称及其值