API Basic ParamArray zh tw - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

ParamArray

ClassicUO • Basic

參數將資料傳入 SUB/FUNCTION。ByRef 把修改後的值寫回呼叫方;ByVal 保留呼叫方的變數。Optional 提供省略的引數,ParamArray 收集剩餘引數。它們是宣告修飾詞,不是可單獨呼叫的命令。

完整語法

Function Sum(ParamArray values())
Sum()
Sum(2, 3, 4)
Sum(existingArray)

參數

  • name / As type — name / As type: 參數名稱及選用的 As 輸入型別轉換。引數可依位置或 name:=value 對應;修飾詞寫在宣告中。請參閱 Basic.NamedArguments。
  • ByRef — ByRef:可修改的變數或既有索引元素。本引擎未寫 ByVal 時也會回寫,與 VB.NET 預設不同。常值、常數及計算式是暫存值。
  • ByVal — ByVal:值的區域副本。重新指定參數不會替換呼叫方變數。陣列與物件仍共用參考,不是深層複製。
  • Optional / defaultValue — Optional / defaultValue:省略尾端引數時才計算 = 後的運算式。請明確提供預設值;否則省略的參數會取得未初始化的 Unit。
  • ParamArray — ParamArray values():最後一個參數接收零個或更多剩餘值。單一陣列直接沿用;純量引數建立新陣列。GetArrayLength 回傳長度。

傳回值

修飾詞不回傳值。RETURN 另外設定函式結果。ByRef 修改引數,不是回傳結果。沒有 RETURN 的 SUB 產生 Unit。範例數字是計算結果,不是 TRUE/FALSE 旗標。

行為

  • 引數由左到右各計算一次。索引式 ByRef 保留容器及索引/鍵;另一個引數重新指定容器變數,不會改變回寫位置。
  • 進入時建立區域參數。離開時先執行內部 FINALLY,再依參數順序回寫 ByRef,包括錯誤離開主體時。同一變數傳入兩個參數不形成即時連動:最後一次回寫生效。
  • ByVal 防止替換呼叫方變數,但仍允許修改共用陣列或物件。ReDim 建立新的區域參考。獨立資料需要明確複製。
  • 位置引數呼叫:Optional 只能從尾端省略;不支援逗號之間的空白引數位置。預設運算式在每次省略時執行,不必是 VB.NET 常數。 位置引數必須在前;第一個具名引數之後只能使用具名引數。必要參數不可省略。腳本中省略的 Optional 參數採用宣告的預設運算式,在傳入運算式之後按宣告順序計算。原生多載只接受註冊的名稱與數量,不增添預設值。
  • ParamArray 不會將打包的純量寫回原變數。明確傳入陣列時,元素修改會影響呼叫方。再傳給另一個 ParamArray 不會增加巢狀層級。
  • 請明確寫出 ByRef 與 ByVal。這些規則適用於腳本呼叫使用者程序;內建命令的參數由各自頁面說明。
  • ParamArray 不能具名傳入。具名呼叫可將它留空;傳入其元素時必須完全使用位置引數。不支援逗號間的空白佔位。本子集採位置引數在前的規則,沒有新版 VB.NET 的自由混用。不增加執行緒或更動遊戲延遲。

範例

1. 空與非空引數

# Sum() 取得空陣列並回傳 0。Sum(2,3,4) 取得三個值並回傳 9。For Each 逐一走訪。Main 回傳 Integer 9。
Option Explicit On
Function Sum(ParamArray values())
    Var total = 0
    For Each value In values
        total += value
    Next
    Return total
End Function
Sub Main()
    Return Sum() + Sum(2, 3, 4)
End Sub

參數與執行說明:

Sum() 取得空陣列並回傳 0。Sum(2,3,4) 取得三個值並回傳 9。For Each 逐一走訪。Main 回傳 Integer 9。

2. 轉傳現有陣列

# values 包含 2 和 5。Forward 將陣列直接傳給 Sum,不增加包裝。Sum 相加並回傳 Integer 7。
Option Explicit On
Function Sum(ParamArray values())
    Var total = 0
    For Each value In values
        total += value
    Next
    Return total
End Function
Function Forward(ParamArray values())
    Return Sum(values)
End Function
Sub Main()
    Dim values[1]
    values[0] = 2
    values[1] = 5
    Return Forward(values)
End Sub

參數與執行說明:

values 包含 2 和 5。Forward 將陣列直接傳給 Sum,不增加包裝。Sum 相加並回傳 Integer 7。

3. 純量與明確傳入的陣列

# SetFirst(first,second) 修改新建陣列,first=2、second=3 不变。SetFirst(packed) 將共用 packed[0] 從 4 改為 9。Main 回傳 2*100+3*10+9,即 Integer 239。
Option Explicit On
Sub SetFirst(ParamArray values())
    If GetArrayLength(values) > 0 Then
        values[0] = 9
    End If
End Sub
Sub Main()
    Var first = 2
    Var second = 3
    SetFirst(first, second)
    Dim packed[0]
    packed[0] = 4
    SetFirst(packed)
    Return first * 100 + second * 10 + packed[0]
End Sub

參數與執行說明:

SetFirst(first,second) 修改新建陣列,first=2、second=3 不变。SetFirst(packed) 將共用 packed[0] 從 4 改為 9。Main 回傳 2100+310+9,即 Integer 239。


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic