过程和函数
过程和函数构成了程序结构中的枢轴点。它们提供了将复杂问题拆分为各种子任务的框架。
过程
过程用于执行操作,而不提供显式值。其语法为
Sub Test
' ... here is the actual code of the procedure
End Sub
本示例定义了一个名为 Test 的过程,其中包含可从程序中的任意位置访问的代码。可通过在程序的相关位置中输入过程名称来调用该过程。
函数
就像过程一样,函数将要执行的程序块合并为一个逻辑单元。不过,与过程不同的是,函数提供返回值。
Function Test
' ... here is the actual code of the function
Test = 123
End Function
返回值是使用简单赋值指定的。不必在函数末尾进行赋值,而是可以在函数中的任意位置进行赋值。
可以按如下方式在程序中调用上面的函数:
Dim A
A = Test
该代码定义了一个变量 A,并将 Test 函数的结果赋值给该变量。
可以在函数中多次覆盖返回值。就像典型的变量赋值一样,本示例中的函数返回最后一次赋给它的值。
Function Test
Test = 12
' ...
Test = 123
End Function
在本示例中,函数的返回值为 123。
如果未指定任何值,则函数返回 zero 值(对于数值,返回数字 0;对于字符串,返回一个空格)。
函数的返回值可以是任意类型。类型的声明方式与变量声明方式相同:
Function Test As Integer
' ... here is the actual code of the function
End Function
提前终止过程和函数
在 Apache OpenOffice Basic 中,可以使用 Exit Sub 和 Exit Function 命令提前终止过程或函数,例如,为进行错误处理而提前终止。这些命令将停止过程或函数,并使程序返回到调用该过程或函数的位置。
以下示例说明了如何终止一个过程:当 ErrorOccured 变量的值为 True 时,就会终止执行该过程。
Sub Test
Dim ErrorOccured As Boolean
' ...
If ErrorOccured Then
Exit Sub
End If
' ...
End Sub
传递参数
函数和过程可以接收一个或多个参数。必须将需要的参数放在函数或过程名称后面的括号中。以下示例定义了一个过程,该过程要求使用整型值 A 和字符串 B 作为参数。
Sub Test (A As Integer, B As String)
' ...
End Sub
在 Apache OpenOffice Basic 中,参数通常是通过引用 传递的。在退出过程或函数时,将会保留对变量所做的更改:
Sub Test
Dim A As Integer
A = 10
ChangeValue(A)
' The parameter A now has the value 20
End Sub
Sub ChangeValue(TheValue As Integer)
TheValue = 20
End Sub
在本示例中,Test 函数中定义的值 A 将作为参数传递给 ChangeValue 函数。然后,将该值更改为 20 并传递给 TheValue;在退出函数时将保留对该值所做的更改。
如果不希望对参数所做的后续更改影响原来传递的值,也可以将参数作为值进行传递。要指定将参数作为值进行传递,请确保在函数标头的变量声明前面加上 ByVal 关键字。
在上一示例中,如果替换 ChangeValue 函数,则上级变量 A 不受此更改的影响。在调用 ChangeValue 函数后,变量 A 的值将保持为 10。
Sub ChangeValue(ByVal TheValue As Integer)
TheValue = 20
End Sub
可选参数
只有当调用期间传递了所有必需参数时,才能调用函数和过程。
Apache OpenOffice Basic 允许将参数定义为可选参数,也就是说,如果调用中不包含相应的值,Apache OpenOffice Basic 将传递一个空参数。在以下示例中,A 参数是必需的,而 B 参数是可选的。
Sub Test(A As Integer, Optional B As Integer)
' ...
End Sub
IsMissing 函数用于检查是传递还是省略了某个参数。
Sub Test(A As Integer, Optional B As Integer)
Dim B_Local As Integer
' Check whether B parameter is actually present
If Not IsMissing (B) Then
B_Local = B ' B parameter present
Else
B_Local = 0 ' B parameter missing -> default value 0
End If
' ... Start the actual function
End Sub
本示例首先测试是否传递了 B 参数,并在必要时将该参数传递给内部 B_Local 变量。如果相应的参数不存在,则将默认值(本例中为值 0)传递给 B_Local,而不是传递已传递的参数。
递归
递归过程或函数能够一直调用其本身,直至检测到已经满足某些基本条件为止。在使用基本条件调用函数时,将会返回一个结果。
以下示例使用递归函数来计算数字 42、-42 和 3.14 的阶乘:
Sub Main
Msgbox CalculateFactorial( 42 ) ' Displays 1,40500611775288E+51
Msgbox CalculateFactorial( -42 ) ' Displays "Invalid number for factorial!"
Msgbox CalculateFactorial( 3.14 ) ' Displays "Invalid number for factorial!"
End Sub
Function CalculateFactorial( Number )
If Number < 0 Or Number <> Int( Number ) Then
CalculateFactorial = "Invalid number for factorial!"
ElseIf Number = 0 Then
CalculateFactorial = 1
Else
' This is the recursive call:
CalculateFactorial = Number * CalculateFactorial( Number - 1 )
Endif
End Function
本示例通过递归调用 CalculateFactorial 函数返回数字 42 的阶乘,直至满足基本条件 0! = 1 为止。
Content on this page is licensed under the Public Documentation License (PDL). |