え、変数の初期化を属性ごとにやってるんですか？という話。

## はじめに

10個以上の属性を持つ`複雑な変数`を初期化したい場合に、属性単位で空値を設定するのって面倒くさいですよね。。。一発でやりましょうや！というお話です。

## BizRobo!における変数のおさらい

BizRobo!の変数には大きく分けてプリミティブ型[^1] に近い`シンプルな変数`と複合データ型である`複雑な変数`が存在します。

これは変数そのものの構造・構成から見た場合の切り分けで、さらには変数のスコープで見た場合の切り分けとして、`ローカル変数`と`グローバル変数`が存在します。

実際に変数をロボットの中で利用する場合には、以下のような組み合わせパターンになります。

|  | ローカル | グローバル |
|:-:|:-:|:-:|
|  **シンプル** |  ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/466d1c7a-a1d7-4f85-a4b4-2bfa789a3945.png)|![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/4cd774ba-ad4d-4e62-97a4-b9216cf8b1a4.png)  |
|  **複雑** | ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/23b9b31f-4b49-a81b-611e-3551b7df21af.png)|![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/3939cef2-e912-6c0b-6514-0c2377e93948.png)  |  

変数の使い分けはロボットの品質に影響を与える判断なので作成時に意識して行いますが、実際に変数に値を割り充てたり初期化したりする方法については割と工夫していなかったりします。

## 最初に習う変数の使い方

変数に値を割り当てる方法として、個別の要素（`シンプルな変数`や`複雑な変数`の属性）を指定するやり方を最初に習います。

実際に「アプリケーション画面から特定の項目をコピーして、変数に割り当てる」操作と同じ粒度（個別の値）で変数を扱うのでわかり易いです。

| ベーシックエンジンロボット | ロボット |
|:-:|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/0cbdecb5-38fd-b0d0-9cfb-ba747c9a76e3.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/a661cc6b-b552-82e4-f206-401ad7c836da.png)|

復号データ型である`複雑な変数`においては、「変数タイプ **.** 属性」という形式で変数を操作します。

ただ、例えば下のような多くの属性を持つ`複雑な変数`の「全ての値」を空に（クリア）したい場合、含まれる属性の数だけ値を空にしていくのは面倒です。（というかあまり意味のないステップがロボット内に広がるのが嫌です:persevere:）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/d7a22ad2-5b7e-c68d-0a96-8ecdbe1ae920.png)

## 変数タイプ全体に値を割り当てる方法

以下、必要になるケースが限られる[^3]ため見落とされがちですが、変数自体を初期化したい場合や同一タイプの別変数に中身をコピーしたい場合に有用な方法です。

まずは前段で示した`複雑な変数`をロボットの中に「全部乗せ」「Flush」と命名して組み込みます。
- 「全部乗せ」は実際に値を割り当ててロボットの処理の中で利用するための変数です。
- 「Flush」は常に空にしておく変数で、「全部乗せ」を初期化する際に上書きするための変数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/b28f1a28-d2bd-7bbd-55f9-03b302cfc636.png)

その後、変数の割り当てアクションにて「変数タイプ **.** 属性」という形式ではなく、「変数タイプ」という形式で「値/エクスプレッション」と「変数」をともに設定します。

:::note
両者は同じ構造（変数タイプ）である必要があります。
:::
| ベーシックエンジンロボット | ロボット |
|:-:|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/d24fbc63-af2f-2a90-d382-cdbcb8eca7e8.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/0e32e490-0aed-a099-5aa3-7e3d975b19f5.png)|

この方法は青いアイコンでおなじみの`ベーシック エンジン ロボット`でも緑アイコンの`ロボット`でも同様に利用できます。

:::note warn
アプリケーションの画面から値を抽出する場合には「最初に習う変数の使い方」と同様に割当先の変数項目は１つに限定されます。[^2]
:::

## サンプルロボット

上で紹介したロボットのソースファイルを GitHub に登録してますので、内容がイメージしにくい場合には実際に動かして確認してください。(v10.4.0.1で作ってあります）

https://github.com/kiban-unyo/Tips_FlushType


## まとめ

他の人が作ったロボットを見ていて「ふっ」と思い立ったので書きました。


[^1]: https://e-words.jp/w/%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E5%9E%8B.html 

[^2]:画面から抽出したデータの割当先は1つの変数/変数の属性に限定されますが、抽出元のデータ構造がある程度固定であれば一発で抜き出す仕組みを組み込むこともできます。ただ、それが必要かというと。。。。

[^3]:例えばグローバル変数をループの中で使用している場合、ループを跨いでも一度設定した値が保持され続けてしまうため、「敢えてループの最初で変数を初期化してきれいな状態でその後の処理に臨む。」ということがあります。ローカル変数を使うことによってイテレーションごとに自動的に初期化されるため、ループだけならグローバルにする必要はないのですが、ループの中でブランチが分かれていて、ブランチ間のデータについては保持したい。。という場合には、DBにデータを保存するか、グローバル変数を使わざるを得ない。という感じです。