FreeBASIC With
目次→言語リファレンス→変数とデータ型→ユーザ定義型→WITH←オリジナル・サイト
命令文ブロックで、ユーザ定義型変数中のフィールドへの、暗黙のアクセスを許します。
構文:
With user_defined_var
statements
End With
記述:
With...End With ブロックは、ユーザ定義
Type のフィールドを参照するとき、ユーザ定義
Type の変数名を、省略できます。
そして、フィールドは、その前のただ一つのピリオド (
.) でアクセスすることができます。
例えば、
Type が "
element" と呼ばれるフィールド要素を含んでいるなら、それは "
.element" として
With ブロックの中でアクセスできます。
これは、入力を節約し、ソースが煩雑になることを避けるための短縮表現として使えます。
With は、下の 2 番目の例に示すように逆参照ポインター、3 番目の例に示すように一時インスタンス (明示的または暗黙のコンストラクターを含む)、さらには一時型 (コンストラクターなし) でも使用できます。これは、このような一時インスタンス/型の破棄が With スコープの最後まで延期されるためです。
ただし、引数として受け取った一時的なインスタンス/型から、関数の byref を返すことは、サポートされていません (エラー メッセージもありません)。
With ブロックは、入れ子にできます。
この場合、最も内側の With ブロックだけがアクティブです。そして、内側のものが再び閉じられるまで、どの外側のものも、無視されます。
この実例として、下の 3番目の例を見てください。
内部で、変数の参照は、
With ブロックの開始で始まり、そして、ブロックの中の、どの要素アクセスの計算にも、使われます。
注意:これは、
Goto を使って、
With ブロックに入り込んではいけない、ということを意味しています。
Goto を使って、
With ブロックに入り込むと、参照は設定されず、参照にアクセスしようとした結果は、未定義になります。
メンバー手続き内で使われる With ブロックのための注意:
型の外部でグローバルとして定義された重複するシンボルにアクセスするには、プレフィックスとして 2つの点を追加します: "..SomeSymbol" (With...End With ブロック内で)。
例:
Type rect_type
x As Single
y As Single
End Type
Dim the_rectangle As rect_type
Dim As Integer temp, t
With the_rectangle
temp = .x
.x = 234 * t + 48 + .y
.y = 321 * t + 2
End With
Print temp, t, the_rectangle.x, the_rectangle.y
Sleep
Type rect_type
x As Single
y As Single
End Type
Dim the_rectangle As rect_type Ptr
the_rectangle = CAllocate
( 5 * Len( rect_type ) )
Dim As Integer loopvar, temp, t
For loopvar = 0 To 4
With the_rectangle
[loopvar] '' dereferenced pointer
temp = .x
.x = 234 * t + 48 + .y
.y = 321 * t + 2
End With
Next
Type rect_type
x As Single
y As Single
Declare Constructor()
Declare Constructor(ByVal x0 As Single, ByVal y0 As Single)
End Type
Constructor rect_type()
End Constructor
Constructor rect_type(ByVal x0 As Single, ByVal y0 As Single)
This.x = x0
This.y = y0
End Constructor
Dim the_rectangle As rect_type
With rect_type(1, 2) '' ここで作成された一時インスタンスは「End With」まで保持されます
the_rectangle.x = .x + .y '' 1 + 2 = 3
the_rectangle.y = .x - .y '' 1 - 2 = -1
End With
Type rect_type
x As Single
y As Single
End Type
Dim As rect_type rect1, rect2
'' 入れ子にされたWithブロック
With rect1
.x = 1
.y = 2
With rect2
.x = 3
.y = 4
End With
End With
Print rect1.x, rect1.y '' 1, 2
Print rect2.x, rect2.y '' 3, 4
Sleep
バージョン:
- fbc 1.10.0 より前では、一時型 (コンストラクターなし) はサポートされていませんでした (このような一時型の破棄は With 命令文の直後に呼び出されたため)。
方言差:
QBからの違い:
参照:
ページ歴史:2023-03-05 01:12:04
日本語翻訳:WATANABE Makoto、原文著作者:SysOp