第10讲 变量

127 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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é进程中的变量。只有创建它的进程才能访问它。它被映射为可以从所有命名空间访问。当进程结束时,所有进程的局部变量都会被删除。
  • 当在事务里时不会将局部变量SETKILL视为日志记录的事务事件;回滚事务对这些操作没有任何影响。
	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