过程和函数

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png


过程和函数构成了程序结构中的枢轴点。它们提供了将复杂问题拆分为各种子任务的框架。

过程

过程用于执行操作,而不提供显式值。其语法为

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 SubExit 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
Documentation note.png 在 Apache OpenOffice Basic 中,将参数传递给过程和函数的方法与 VBA 中使用的方法几乎相同。默认情况下,参数是通过引用传递的。要将参数作为值进行传递,请使用 ByVal 关键字。在 VBA 中,还可以使用关键字 ByRef 强制通过引用传递参数。Apache OpenOffice Basic 可以识别该关键字,但会将其忽略,因为这已经是 Apache OpenOffice Basic 中的默认过程。

可选参数

只有当调用期间传递了所有必需参数时,才能调用函数和过程。

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,而不是传递已传递的参数。

Documentation note.png Apache OpenOffice Basic 不支持 VBA 中的 ParamArray 关键字。

递归

递归过程或函数能够一直调用其本身,直至检测到已经满足某些基本条件为止。在使用基本条件调用函数时,将会返回一个结果。

以下示例使用递归函数来计算数字 42-423.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 为止。

Documentation note.png 递归级别设置因软件平台而异。对于 Windows,递归级别为 5800。对于 Solaris 和 Linux,将会评估堆栈大小并计算递归级别。
Content on this page is licensed under the Public Documentation License (PDL).


Personal tools