过程和函数

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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