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

    相关文章

      网友评论

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

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