第十章 ObjectScript - 按值或按引用传递变量
2023-08-26 本文已影响0人
Cache技术分享
第十章 ObjectScript - 按值或按引用传递变量
按值或按引用传递变量
调用方法时,可以通过值或引用将变量值传递给该方法。在大多数情况下,这些变量是没有下标的局部变量,因此本节首先讨论这些变量。
与其他编程语言一样, IRIS
具有一个存储位置,其中包含每个局部变量的值。变量的名称充当内存位置的地址。
当将没有下标的局部变量传递给方法时,可以按值传递该变量。这意味着系统会复制该值,从而使原始值不受影响。要传递内存地址,请在参数列表中紧邻变量名称之前放置一个句点。
为了演示这一点,请考虑名为 Test.Parameters
的类中的以下方法:
ClassMethod Square(input As %Integer) As %Integer
{
set answer=input*input
set input=input + 10
return answer
}
假设定义一个变量并将其按值传递给此方法:
TESTNAMESPACE>set myVariable = 5
TESTNAMESPACE>write ##class(Test.Parameters).Square(myVariable)
25
TESTNAMESPACE>write myVariable
5
相反,假设通过引用传递变量:
TESTNAMESPACE>set myVariable = 5
TESTNAMESPACE>write ##class(Test.Parameters).Square(.myVariable)
25
TESTNAMESPACE>write myVariable
15
考虑以下方法,该方法写入它收到的参数的内容:
ClassMethod WriteContents(input As %String)
{
zwrite input
}
现在,假设有一个包含三个节点的数组:
TESTNAMESPACE>zwrite myArray
myArray="Hello"
myArray(1)="My"
myArray(2)="Friend"
如果按值将数组传递给方法,则仅传递顶级节点:
TESTNAMESPACE>do ##class(Test.Parameters).WriteContents(myArray)
input="Hello"
如果通过引用将数组传递给方法,则将传递整个数组:
TESTNAMESPACE>do ##class(Test.Parameters).WriteContents(.myArray)
input="Hello"
input(1)="My"
input(2)="Friend"
可以将Global
的单个节点的值传递给方法:
TESTNAMESPACE>zwrite ^myGlobal
^myGlobal="Start"
^myGlobal(1)="Your"
^myGlobal(2)="Engines"
TESTNAMESPACE>do ##class(Test.Parameters).WriteContents(^myGlobal)
input="Start"
尝试通过引用将Global
传递给方法会导致语法错误:
TESTNAMESPACE>do ##class(Test.Parameters).WriteContents(.^myGlobal)
^
<SYNTAX>
下表总结了所有可能性:
变量种类 | 按值传递 | 通过引用传递 |
---|---|---|
没有下标的局部变量 | 传递这些变量的标准方式 | 允许 |
带下标的局部(数组) | 传递单个节点的值 | 传递这些变量的标准方式 |
带或不带下标的Global 全局变量 |
传递单个节点的值 | 不能以这种方式传递(全局数据不在内存中) |
对象引用 (OREF )*
|
传递这些变量的标准方式 | 允许 |
*
如果有一个代表对象的变量,则可以通过对象引用 (OREF
) 来引用该对象。当将 OREF
作为参数传递时,通常按值传递它。但是,由于 OREF
是指向对象的指针,因此实际上是通过引用传递对象。更改方法内对象的属性值会更改实际对象,而不是对象的副本。允许通过引用传递 OREF
,并且如果想要更改 OREF
以指向不同的对象,则可以使用该方法。这不是常见用法。