美文网首页
第十章 ObjectScript - 按值或按引用传递变量

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

作者: Cache技术分享 | 来源:发表于2023-08-26 07:45 被阅读0次

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

相关文章

  • 方法参数

    一、参数传递 1.参数传递有两种类型:按值传递和按引用传递。 2.按值传递指变量使用的是参数传递的值,而按引用传递...

  • 2018-03-21

    按值传递和按引用传递 按引用传递function test(obj){这里对num这个变量创建了一个内存的副本当前...

  • JS是按值传递还是按引用传递?

    JS是按值传递还是按引用传递? 按值传递 VS. 按引用传递 探究JS值的传递方式 按共享传递 call by s...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • golang学习笔记9:函数参数与返回值

    按值传递和按引用传递 Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过...

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

  • 再学JS--函数参数传递类型

    JavaScript的函数参数传递分为按值传递、按引用传递以及按共享传递。 按值传递 什么是按值传递? 把函数外部...

  • 按值传递、按引用传递、按共享传递

    按值传递、按引用传递、按共享传递 按值传递(call by value) 按值传递,就是指在调用函数时,将实参对应...

  • 基本类型和引用类型作为函数参数传递

    基本类型是按值传递的: 引用类型也是按值传递的: 证明引用类型是按值传递的例子:

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

网友评论

      本文标题:第十章 ObjectScript - 按值或按引用传递变量

      本文链接:https://www.haomeiwen.com/subject/cawbmdtx.html