携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第42天,点击查看活动详情
第10讲 变量
- 通常,可以使用
set命令通过为变量赋值来定义变量。可以将空字符串("")值赋给变量。大多数命令和函数在使用之前都需要定义变量。如果变量未定义,则默认情况下,引用它会生成<UNDEFINED>错误。
s yx = ""
s yx = b
s yx = b }
^
<UNDEFINED>zVariable+2^M.Ten.1 *b
- 通过设置
%SYSTEM.Process.Unfined()方法,可以使其在引用未定义变量时不会生成<UNDEFINED>错误。0默认为0,对任何未定义的变量发出<UNDEFINED>错误。1对于任何未定义的变量返回一个空字符串。
d ##class(%SYSTEM.Process).Undefined(2)
s yx = ""
s yx = b
- 可以在一些操作中使用未定义的变量。
s yx = $increment(c) //自增
s yx = $get(d) //保护如果未定义取返回""
s yx = $data(e) //判断变量是否存在
局部变量
- 局部变量是存储在当前Caché进程中的变量。只有创建它的进程才能访问它。它被映射为可以从所有命名空间访问。当进程结束时,所有进程的局部变量都会被删除。
- 当在事务里时不会将局部变量
SET或KILL视为日志记录的事务事件;回滚事务对这些操作没有任何影响。
s a = 2
ts
s a = 1
tro
w a,!
百分比变量
- 局部变量名必须是有效的标识符。其第一个字符必须是字母或百分号(
%)字符。以“%”字符开头的变量名称称为“百分比变量”,具有不同的作用域规则。只有以“%Z”或“%z”开头的变量才可用于应用程序代码;所有其他百分比变量将保留给系统使用。百分号(%)字符只能用作局部变量名称的第一个字符。局部变量名的其他字符可以是字母或数字。
/// d ##class(YX.Third).Variable1()
ClassMethod Variable1()
{
s %za = "百分比变量"
w %za,!
}
/// d ##class(YX.Third).Variable2()
ClassMethod Variable2()
{
w %za,!
}
DHC-APP>d ##class(YX.Third).Variable1()
百分比变量
DHC-APP>d ##class(YX.Third).Variable2()
百分比变量
- 通常复用一些固定配置的时候会用到它。
q:($d(%zconfig))
s %zconfig = ##class(XX).XX()
- 局部变量名称限制为
31个字符。可以指定长度超过31个字符的名称,但仅使用前31个字符。因此,局部变量名在其前31个字符内必须是唯一的。
s abcdef1234abcdef1234abcdef1234a = 1
s abcdef1234abcdef1234abcdef1234ab = 2
w abcdef1234abcdef1234abcdef1234a,!
2
ProcedureBlock使用
- 私有变量。程序块中使用的任何变量都自动成为私有变量,并且仅在该程序块中可见。默认情况下,创建的所有对象方法都使用过程块(
ProcedureBlock类关键字在类定义中设置),因此,默认情况下,在方法中创建的所有变量都是私有变量。不能对私有变量使用new命令。
Class YX.Third Extends %RegisteredObject [ Not ProcedureBlock ]
/// d ##class(YX.Third).ProcedureBlock()
ClassMethod ProcedureBlock()
{
for i = 1 : 1: 5{
d ..ProcedureBlock1()
}
}
ClassMethod ProcedureBlock1()
{
w "这是Not ProcedureBlock",!
s i = 2
}
}
运行发现是一个死循环,!
- 如果在
Not ProcedureBlock类里传参数一定要初始化n,否则会未定意。
/// d ##class(YX.Third).ProcedureBlock()
ClassMethod ProcedureBlock()
{
for i = 1 : 1: 5{
d ..ProcedureBlock1("this is a String")
}
}
ClassMethod ProcedureBlock1(var)
{
n (var)
w var,!
w "这是Not ProcedureBlock",!
s i = 2
}
进程私有全局变量
- 进程私有全局变量是一个只能由创建它的进程访问的变量。它被映射为可以从所有命名空间访问。当该进程结束时,其所有进程私有全局变量都将被删除。
s ^||yx = 2
zw ^||yx
s $namespace = "%sys"
zw ^||yx
- 进程私有全局变量旨在用于大量数据时。
- 进程专用全局名称采用以下形式之一,第一种形式(
^||name)最常见,也是新代码推荐使用的形式。提供第二、第三和第四种形式是为了与定义全局变量的现有代码兼容。它们允许指定一个变量,该变量确定是将名称定义为进程私有全局还是标准全局。
^||name
^|"^"|name
^["^"]name
^["^",""]name
- 回滚事务对进程私有全局变量这些操作没有任何影响。
/// d ##class(YX.Third).Variable5()
ClassMethod Variable5()
{
k ^||yx("yaoxin")
s ^||yx("yaoxin") = "姚鑫"
ts
s ^||yx("yaoxin") = "tro"
tro
w ^||yx("yaoxin")
}
DHC-APP>d ##class(YX.Third).Variable5()
tro
- 进程专用全局名称限制为
31个字符,不包括前缀字符。可以指定长度超过31个字符的名称,但仅使用前31个字符。因此,进程专用全局名称在其前31个字符内必须是唯一的。
s ^||abcdef1234abcdef1234abcdef1234a = 1
s ^||abcdef1234abcdef1234abcdef1234ab = 2
zw ^||abcdef1234abcdef1234abcdef1234a
zw ^||abcdef1234abcdef1234abcdef1234ab
^||abcdef1234abcdef1234abcdef1234a=2
^||abcdef1234abcdef1234abcdef1234a=2