API Basic Structure ja - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Structure / New / fields

ClassicUO • Basic

Structure は X、Y、Z などの型付きフィールドを一つの値にまとめます。このエンジンでは値コピーを行うデータ構造を扱います。VB.NET の Structure 全機能を実装したものではありません。

正確な構文

[Public | Private] Structure TypeName
    [Public | Dim | VAR] field As FieldType
End Structure
Dim value As TypeName
Dim value = New TypeName()
copy = value
value.field = expression
Sub Change(ByRef value As TypeName)
Function Copy(ByVal value As TypeName) As TypeName

パラメーター

  • TypeName / Public / Private — ファイル直下または Module 内で宣言する、一意の単純な型名です。既定は Public。Private は Module 内だけで使用でき、外部から型名を参照できません。公開モジュール型は ModuleName.TypeName で指定します。キーワードとフィールド名は翻訳しません。
  • field / FieldType — 一意のフィールド名、As、対応するスカラー型・Enum・別の Structure を指定します。フィールドは公開で、Public、Dim、VAR を使用できます。型は Integer/Long/Short/Byte、Single/Double/Decimal、String、Boolean/Bool、Object/Variant。整数の別名はすべて符号付き 32 ビットです。循環する入れ子は禁止です。
  • Dim / New — Dim value As TypeName と New TypeName() は、ユーザーコードを呼び出さずに既定値を作ります。New の括弧は空にします。X/Y/Z は引数ではなく、作成後にフィールドへ代入します。Dim copy = value は式の値を取得します。UO. 接頭辞は不要です。
  • value.field / copy — ドットで読み書きし、route.Start.X のような入れ子も指定できます。書き込み時はフィールド型を確認し、それを含む値を置き換えます。copy = value はスカラーと入れ子の構造値をコピーするため、copy.X の変更は value.X を変えません。互換性のある構造型を代入してください。
  • ByVal / ByRef — ByVal は値のコピーを渡します。ByRef は呼び出し時にコピーし、終了時に呼び出し元へ書き戻します。書き込み可能なフィールドも渡せます。修飾子は明示してください。省略時は既存の Basic 規則に従います。Return で構造を返し、Function で As TypeName を宣言できます。

戻り値

宣言と代入には結果がありません(Unit)。New と対応する関数は構造値を返し、実行観察では Object として表され、表示に宣言型名が含まれます。座標は数量であり Boolean フラグではありません。= と <> の結果は 1/True または 0/False。例の String 結果は "1445:1447:1690:0"、"10:15:24"、"2:4:2:2" です。

動作

  • 宣言は初期化式の実行前に検査します。スクリプト当たり最大 256 型、各型に 1~256 フィールド、入れ子は 32 階層まで。重複・不明なフィールド型、循環、上限超過は SC030 です。名前の解決時に Private を検査します。
  • フィールドの既定値は整数/Enum が 0、浮動小数点が 0、Boolean が 0/False、String が空文字列、Object/Variant が代入前の Unit です。入れ子もその構造の既定値です。宣言中のフィールド初期化には非対応なので、作成後に代入してください。
  • Object と配列のフィールドはコピー時も参照を保持します。したがって List、Dictionary、配列を共有する場合があります。スカラーと入れ子の値は独立して変更されますが、共有コレクションの内容変更は両方に見えます。List は追加した時点の構造値を保存します。
  • = は同じ宣言型と対応するフィールドを比較し、<> は逆の結果です。参照フィールドは同一性を比較します。これはエンジン独自の拡張であり、VB.NET の任意の構造が = を使えるという意味ではありません。保存済みハッシュと検査済みペアにより、共有された入れ子の反復展開を防ぎます。
  • 対応範囲は公開型付きデータフィールド、Module の可視性、New()、代入、引数と戻り値です。内部メソッド、独自コンストラクター、フィールド初期化、プロパティ、継承、非公開フィールドは未対応です。WITH .field と array[index].field は使えません。要素を変数へ読み、変更後に書き戻してください。宣言を Include ファイルに置くことは可能です。

使用例

1. 座標と独立したコピー

# original は X=1445、Y=1690、Z=0。copy に値をコピーし、copy.X += 2 でコピーだけを変更します。New Position() は Z=0 の empty を作ります。結果は 1445:1447:1690:0。これは座標の保存例で、キャラクターを移動させません。
Option Explicit On
Structure Position
    Public X As Integer
    Public Y As Integer
    Public Z As Integer
End Structure

Sub Main()
    Dim original As Position
    original.X = 1445
    original.Y = 1690
    Dim copy = original
    copy.X += 2
    Dim empty = New Position()
    Return CStr(original.X) & ":" & CStr(copy.X) & ":" & CStr(copy.Y) & ":" & CStr(empty.Z)
End Sub

パラメーターと実行の説明:

original は X=1445、Y=1690、Z=0。copy に値をコピーし、copy.X += 2 でコピーだけを変更します。New Position() は Z=0 の empty を作ります。結果は 1445:1447:1690:0。これは座標の保存例で、キャラクターを移動させません。

2. 入れ子の経路、ByVal と ByRef

# Route は Position 型の Start と Finish を持ちます。Shift(point ByVal, dx ByVal) はコピーの X に dx を足し、Position を返します。point:=route.Start、dx:=5 で shifted.X=15、Start.X=10 のままです。Advance(route ByRef, dx ByVal) は Finish.X に 4 を足して Route を書き戻し、24 にします。Main の結果は 10:15:24。補助手続きもすべて掲載しています。
Option Explicit On
Structure Position
    Public X As Integer
    Public Y As Integer
End Structure
Structure Route
    Public Start As Position
    Public Finish As Position
End Structure

Function Shift(ByVal point As Position, ByVal dx As Integer) As Position
    point.X += dx
    Return point
End Function

Sub Advance(ByRef route As Route, ByVal dx As Integer)
    route.Finish.X += dx
End Sub

Sub Main()
    Dim route As Route
    route.Start.X = 10
    route.Finish.X = 20
    Dim shifted = Shift(point:=route.Start, dx:=5)
    Advance(route:=route, dx:=4)
    Return CStr(route.Start.X) & ":" & CStr(shifted.X) & ":" & CStr(route.Finish.X)
End Sub

パラメーターと実行の説明:

Route は Position 型の Start と Finish を持ちます。Shift(point ByVal, dx ByVal) はコピーの X に dx を足し、Position を返します。point:=route.Start、dx:=5 で shifted.X=15、Start.X=10 のままです。Advance(route ByRef, dx ByVal) は Finish.X に 4 を足して Route を書き戻し、24 にします。Main の結果は 10:15:24。補助手続きもすべて掲載しています。

3. 保存された値と共有コレクション

# Entry は値の Point と Object の Items を持ちます。first.Point.X=2、Items は文字列一つ入りの List()。snapshots.Add(first) が値を保存します。second=first の後 second.Point.X=4 にしても保存済みの 2 は変わりません。second.Items.Add("ingot") は共有リストを変更するため first.Items.Count()=2。saved=snapshots[0] で要素のフィールドを読みます。結果は 2:4:2:2。
Option Explicit On
Structure Position
    Public X As Integer
End Structure
Structure Entry
    Public Point As Position
    Public Items As Object
End Structure

Sub Main()
    Dim first As Entry
    first.Point.X = 2
    first.Items = List()
    first.Items.Add("ore")
    Dim snapshots = List()
    snapshots.Add(first)

    Dim second = first
    second.Point.X = 4
    second.Items.Add("ingot")
    Dim saved = snapshots[0]
    Return CStr(first.Point.X) & ":" & CStr(second.Point.X) & ":" & CStr(saved.Point.X) & ":" & CStr(first.Items.Count())
End Sub

パラメーターと実行の説明:

Entry は値の Point と Object の Items を持ちます。first.Point.X=2、Items は文字列一つ入りの List()。snapshots.Add(first) が値を保存します。second=first の後 second.Point.X=4 にしても保存済みの 2 は変わりません。second.Items.Add("ingot") は共有リストを変更するため first.Items.Count()=2。saved=snapshots[0] で要素のフィールドを読みます。結果は 2:4:2:2。

内部関数:呼び出しから結果まで

Structure は X、Y、Z などの型付きフィールドを一つの値にまとめます。このエンジンでは値コピーを行うデータ構造を扱います。VB.NET の Structure 全機能を実装したものではありません。

1. Build / PrepareDefault

宣言は初期化式の実行前に検査します。スクリプト当たり最大 256 型、各型に 1~256 フィールド、入れ子は 32 階層まで。重複・不明なフィールド型、循環、上限超過は SC030 です。名前の解決時に Private を検査します。

declarations -> field types -> visibility -> cycle/depth checks -> immutable defaults

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/StructureCatalog.cs; 関数 Build / PrepareDefault.

2. VisitNewStructure

Dim value As TypeName と New TypeName() は、ユーザーコードを呼び出さずに既定値を作ります。New の括弧は空にします。X/Y/Z は引数ではなく、作成後にフィールドへ代入します。Dim copy = value は式の値を取得します。UO. 接頭辞は不要です。

resolve TypeName -> prepared default value; no procedure call

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; 関数 VisitNewStructure.

3. WithField / SetVar

ドットで読み書きし、route.Start.X のような入れ子も指定できます。書き込み時はフィールド型を確認し、それを含む値を置き換えます。copy = value はスカラーと入れ子の構造値をコピーするため、copy.X の変更は value.X を変えません。互換性のある構造型を代入してください。

resolve path -> coerce field -> replace path -> assign new root value

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; 関数 WithField / SetVar.

4. CreateArgumentWriter

ByVal は値のコピーを渡します。ByRef は呼び出し時にコピーし、終了時に呼び出し元へ書き戻します。書き込み可能なフィールドも渡せます。修飾子は明示してください。省略時は既存の Basic 規則に従います。Return で構造を返し、Function で As TypeName を宣言できます。

ByVal: value copy; ByRef: value copy -> callee -> caller slot write-back

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; 関数 CreateArgumentWriter.

5. ValueEquals

= は同じ宣言型と対応するフィールドを比較し、<> は逆の結果です。参照フィールドは同一性を比較します。これはエンジン独自の拡張であり、VB.NET の任意の構造が = を使えるという意味ではありません。保存済みハッシュと検査済みペアにより、共有された入れ子の反復展開を防ぎます。

type identity -> cached hash -> distinct field pairs; reference members keep identity

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; 関数 ValueEquals.

宣言と代入には結果がありません(Unit)。New と対応する関数は構造値を返し、実行観察では Object として表され、表示に宣言型名が含まれます。座標は数量であり Boolean フラグではありません。= と <> の結果は 1/True または 0/False。例の String 結果は "1445:1447:1690:0"、"10:15:24"、"2:4:2:2" です。


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

Basic