文章
· 八月 26, 2023 阅读大约需 3 分钟

第十章 ObjectScript - 按值或按引用传递变量

第十章 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 以指向不同的对象,则可以使用该方法。这不是常见用法。

讨论 (0)1
登录或注册以继续