方法可以在逗号分隔的列表中接受位置参数。对于每个参数,可以指定类型和默认值。
例如,下面是一个接受三个参数的方法的部分定义。这对IRIS
类中的ObjectScript
和Python
方法都是有效的语法:
Method Calculate(count As %Integer, name, state As %String = "CA") as %Numeric
{
// ...
}
注意,其中两个参数具有显式类型,一个参数具有默认值。通常,显式指定每个参数的类型是个好主意。
注意:如果一个方法是在Python
中定义的,并且有任何带有默认值的参数,那么这些参数必须位于参数列表的末尾,以避免编译错误。
调用方法时,如果有合适的默认值,可以跳过参数。ObjectScript
和Python
都有自己的语法来跳过参数。
在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
关键字指示应该通过引用传递此参数,并且该方法忽略最初给此参数的任何值。
类似地,当定义一个方法时,可以在方法签名中使用ByRef
和Output
关键字来通知其他用户该方法的使用方式。
要在ObjectScript
中通过引用传递参数,请在调用方法时在变量名之前放置一个句号。在Python
中,对要传递的值使用iris.ref()
,并在引用上调用该方法。这两个都显示在下面的例子中:
Do MyMethod(arg1, .arg2, .arg3)
arg2=iris.ref("peanut butter")
arg3=iris.ref("jelly")
MyMethod(arg1,arg2,arg3)
重要信息:ByRef
和 Output
关键字提供的信息对于使用 类引用的任何人都有利。它们不影响代码的行为。方法的编写者有责任强制执行有关如何调用该方法的任何规则。
可以定义一个方法,使其接受可变数量的参数。例如:
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), "" ), !
}
}
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])
}
要在 ObjectScript
或 Python
方法中指定参数的默认值,请使用以下示例中所示的语法:
Method Test(flag As %Integer = 0)
{
//method details
}
调用方法时,它会对任何缺少的参数使用其默认值(如果指定)。如果方法是用 Python
编写的,则任何具有默认值的参数都必须在参数列表的末尾定义。
在 ObjectScript
中,另一个选项是使用 $GET
函数设置默认值。例如:
Method Test(flag As %Integer)
{
set flag=$GET(flag,0)
//method details
}
但是,这种技术不会影响类签名。