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

ByVal

ClassicUO • Basic

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

完整語法

Sub Change(ByVal value)
Function Increment(ByVal value)
Increment(expression)

參數

  • 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. 保留純量變數

# Change 取得 amount=5 的副本。區域指定 99 不影響外部變數。Main 回傳 Integer 5。
Option Explicit On
Sub Change(ByVal amount)
    amount = 99
End Sub
Sub Main()
    Var amount = 5
    Change(amount)
    Return amount
End Sub

參數與執行說明:

Change 取得 amount=5 的副本。區域指定 99 不影響外部變數。Main 回傳 Integer 5。

2. 共用陣列與區域 ReDim

# ByVal 仍共用元素,所以它變成 9。ReDim 建立另一個區域陣列,20 只寫入該陣列。外部陣列長度仍是 1、值為 9。Main 回傳 Integer 91。
Option Explicit On
Sub Change(ByVal items)
    items[0] = 9
    ReDim items[1]
    items[0] = 20
End Sub
Sub Main()
    Dim items[0]
    items[0] = 4
    Change(items)
    Return items[0] * 10 + GetArrayLength(items)
End Sub

參數與執行說明:

ByVal 仍共用元素,所以它變成 9。ReDim 建立另一個區域陣列,20 只寫入該陣列。外部陣列長度仍是 1、值為 9。Main 回傳 Integer 91。

3. 運算式與獨立結果

# amount+3 得到 7。Increment 將區域值改成 8 並回傳。外部 amount 保持 4。Main 回傳 4*10+8,即 Integer 48。
Option Explicit On
Function Increment(ByVal value)
    value += 1
    Return value
End Function
Sub Main()
    Var amount = 4
    Var result = Increment(amount + 3)
    Return amount * 10 + result
End Sub

參數與執行說明:

amount+3 得到 7。Increment 將區域值改成 8 並回傳。外部 amount 保持 4。Main 回傳 4*10+8,即 Integer 48。


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

Basic