Caché识别五种类型的间接寻址:
- Name indirection
- Pattern indirection
- Argument indirection
- Subscript indirection
- $TEXT argument indirection
执行哪种类型的间接寻址取决于@variable
出现的上下文。下面将分别描述每种类型的间接连接。
间接寻址符不能与点语法一起使用。这是因为点语法是在编译时解析的,而不是在运行时解析的。
名称间接寻址
在名称间接寻址中,间接计算结果为变量名、行标签或例程名称。在执行该命令之前将变量的内容替换为预期的名称。
名称间接寻址只能访问公共变量。
使用间接地址引用命名变量时,间接地址的值必须是完整的全局变量或局部变量名,包括任何必要的下标。
ClassMethod Indirection1() { s Y = "B" w Y,! s @Y = 6 if Y '= @Y w "不相等!",! w @Y,! } 复制代码
重要提示:如果使用间接方式获取或设置对象属性值,可能会导致错误。不要使用此类调用,因为会绕过属性访问器方法(Get和Set)。相反,可以使用CLASSMETHOD、CLASSMETHOD、CLASSMETHOD、METHOD和$PROPERTY)函数。
- 当使用间接寻址引用行标签时,间接的值必须是语法上有效的行标签。
- 如果
name
的值为1
,则标签的值为apple
。 - 如果
name
的值为2
,则标签的值为banana
。 - 如果
name
的值为其他时,则标签的值为stop
。
ClassMethod Indirection2(name) { s fruit = $select(name = 1 : "apple", name = 2 : "banana", 1 : "stop") fruit goto @fruit q apple w "apple" q banana w "banana" q stop w "stop" q } 复制代码
- 当使用间接引用例程名时,间接寻址的值必须是语法上有效的例程名。
ClassMethod Indirection3(name) { s fruit = $select(name = 1 : "apple1", name = 2 : "banana1", 1 : "stop1") d @fruit q apple1() w "apple1" banana1() w "banana1" stop1() w "stop1" } 复制代码
- 名称间接寻址只能替换名称值。
ClassMethod Indirection4(name) { s var1 = "var2" s var2 = 5 s x = @var1 * 6 w x,! } 复制代码
- 当计算等号右边的表达式时将
@var1
解释为对变量名的间接引用,而不是数值。
s var1 = "5" s x = @var1 * 6 w x,!