Classes -方法参数

描述

方法参数

方法可以在逗号分隔的列表中接受位置参数。对于每个参数,可以指定类型和默认值。

例如,下面是一个接受三个参数的方法的部分定义。这对IRIS类中的ObjectScriptPython方法都是有效的语法:

Method Calculate(count As %Integer, name, state As %String = "CA") as %Numeric
{
    // ...
}

注意,其中两个参数具有显式类型,一个参数具有默认值。通常,显式指定每个参数的类型是个好主意。

注意:如果一个方法是在Python中定义的,并且有任何带有默认值的参数,那么这些参数必须位于参数列表的末尾,以避免编译错误。

跳过参数

调用方法时,如果有合适的默认值,可以跳过参数。ObjectScriptPython都有自己的语法来跳过参数。

在ObjectScript中,可以通过不为参数提供值并保持逗号结构来跳过该参数。例如:

set myval=##class(mypackage.myclass).GetValue(,,,,,,4)

IRIS类中,Python方法的签名必须首先列出所需的参数,然后是具有默认值的任何参数。

调用方法时,必须按照方法签名的顺序提供参数。因此,一旦你跳过了一个参数,你也必须跳过它后面的所有参数。例如:

ClassMethod Skip(a1, a2 As %Integer = 2, a3 As %Integer = 3) [ Language = python ]
{
    print(a1, a2, a3)
}
TESTNAMESPACE >do ##class(mypackage.myclass).Skip(1)
1 2 3

通过值或引用传递变量

当调用一个方法时,可以通过值或引用将变量的值传递给该方法。

方法的签名通常表明是否打算通过引用传递参数。例如:

Method MyMethod(argument1, ByRef argument2, Output argument3)

ByRef关键字指示应该通过引用传递此参数。Output关键字指示应该通过引用传递此参数,并且该方法忽略最初给此参数的任何值。

类似地,当定义一个方法时,可以在方法签名中使用ByRefOutput关键字来通知其他用户该方法的使用方式。

要在ObjectScript中通过引用传递参数,请在调用方法时在变量名之前放置一个句号。在Python中,对要传递的值使用iris.ref(),并在引用上调用该方法。这两个都显示在下面的例子中:

Do MyMethod(arg1, .arg2, .arg3)
arg2=iris.ref("peanut butter")
arg3=iris.ref("jelly")
MyMethod(arg1,arg2,arg3)

重要信息:ByRefOutput 关键字提供的信息对于使用 类引用的任何人都有利。它们不影响代码的行为。方法的编写者有责任强制执行有关如何调用该方法的任何规则。

可变数量的参数

可以定义一个方法,使其接受可变数量的参数。例如:

ClassMethod MultiArg(Arg1... As %List) [ Language = objectscript ]
{
 Set args = $GET(Arg1, 0)
 Write "Invocation has ",
     args,
     " element",
     $SELECT((args=1):"", 1:"s"), !
 For i = 1 : 1 : args
 {
     Write "Argument[", i , "]: ", $GET(Arg1(i), "< NULL >"), !
 }
}
ClassMethod MultiArg(Arg1... As %List) [ Language = Python ]
{
    print("Invocation has", len(Arg1), "elements")
    for i in range(len(Arg1)):
        print("Argument[" + str(i+1) + "]: " + Arg1[i])
}

指定默认值

要在 ObjectScriptPython 方法中指定参数的默认值,请使用以下示例中所示的语法:

Method Test(flag As %Integer = 0)
{
 //method details
}

调用方法时,它会对任何缺少的参数使用其默认值(如果指定)。如果方法是用 Python 编写的,则任何具有默认值的参数都必须在参数列表的末尾定义。

ObjectScript 中,另一个选项是使用 $GET 函数设置默认值。例如:

Method Test(flag As %Integer)
{
  set flag=$GET(flag,0)
 //method details
}

但是,这种技术不会影响类签名。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分