bash-oo-frameworkリファレンス [WIP]

この投稿はまだ作業中です。
ノウハウ集というか、リファレンス集になるようなものを書いていこうと思っています
自分の必要に応じて増えていきます。

---

# 型

## 基本型

基本型は以下の通りです。

| 型名        | 説明     | Pure bashの場合
|:-:          |:-:       |:-:                  |
| string      | 文字列型 | `declare -- <name>` |
| integer     | 数値型   | `declare -i <name>` |
| array       | 配列     | `declare -a <name>` |
| map         | 仮想配列 | `declare -A <name>` |
| boolean     | 真偽値   | 存在しません。      |

このほかにも、ユーザーが定義することもできます。(多分)(型の概念間違ってたらごめんなさい)

各変数は、他の言語と同じように型名を使って宣言できます。

```bash
# string型の 'text'変数
string text
# 数値型の 'number'変数
integer number
# 配列の list
array list
# 仮想配列のtable
map table
# 真偽値の is_it
boolean is_it
```

*これを使用することで、各種ハンドラが使用可能になります。*
使わずに`declare`等を使って定義した場合、各種ハンドラを使用するには`var:`を使用する必要があります(後述)

## ハンドラ

変数に、特殊な方法でアクセスすることで各型の「ハンドラ」を利用することができます。
ハンドラを利用すると、ソートや大文字/小文字への変換等のメゾットを利用することができます。

ハンドラを使用する方法は二つあります。

| 方法 | 例 | 備考 |
| `$var:<name> <handler>` | `$var:text toUpper` | oo-framework独自の変数定義(上で解説した方法)で作成された変数にのみ有効 |
| `var: <name> <handler>` | `var: text toUpper` | どんな変数にも適用可能です |

ここから先、`$var:<name>`で示されている部分は`var: <name>`でも置き換え可能です。

## array

配列型。

```
array newArray
```

| 操作    | method | 例 | 備考 |
|:-:      |:-:                   |:-:               |:-:|
|定義     | `array <name>`       | `array newArray` | |
|値の取得 | `$var:<name> get <index>` | `newArray get 1` | |
|値の設定 | `$var:<name> set <index> <value>` | `newArray set 1 "test"` | `=`は使えない！！ |
|forEach  | `$var:<name>` forEach 'expression'` | `$var:newArray forEach 'echo ${item}'` | 引数として渡された文字列はそのまま関数になって実行される |

### 定義: array <name>

| method | 例 | 備考 |
|:-:     |:-: |:-:   |
| `array <name>`       | `array newArray` | |

配列の定義。
この形で定義すると`$var:<name>`のハンドラが使えるようになります

### 値の取得:

| method | 例 | 備考 |
|:-:     |:-: |:-:   |
|値の取得 | `$var:<name> get <index>` | `newArray get 1` | |


### array forEach

| 操作 | method | 例 | 備考 |
|:-:   |:-:     |:-: |:-:   |
|forEach  | `$var:<name> forEach 'expression'` | `$var:newArray forEach 'echo ${item}'` | 引数として渡された文字列はそのまま関数になって実行される |

`forEach`の第一引数に渡した文字列は、そのまま関数になって実行される。
この時、二つの変数が元から定義されている:

| 名前 | 用途 |
|:-:|:-:|
| `index` | 現在の要素番号 |
| `item` | その配列の`index`番目の要素 |

つまり、以下のコードは:

```bash
## newArray is ( "a" "b" "c" "d" )
$var:newArray forEach 'echo "${index}" is : ${item}'
```

以下の結果をもたらします

```bash
1 is : a
2 is : b
3 is : c
4 is : d
```


# クラス定義

```bash
import util/class
```

クラスを定義するには、以下のようにします:

```bash
class:<class_name>() {
  # 中身
}
```

例(公式から引用+改変):

```bash
class:Human() {
  public string name
  public integer height
  public array eaten

  Human.__getter__() {
    echo "I'm a human called $(this name), $(this height) cm tall."
  }

  Human.Eat() {
    [string] food

    this eaten push "$food"

    # 値が代入された文字列を返します:
    @return:value "$this just ate $food, which is the same as $1"
  }

  # 静的メゾットにするには`::`を使用します
  Human::PlaySomeJazz() {
    echo "$(UI.Powerline.Saxophone)"
  }
}
```

## クラスの書式

### プロパティ

基本形:

```bash
<修飾子> <public/private> <型名> <変数名> <初期化文>
```

(名称は非公式です)
このうち、`型名`と`変数名`、`privateもしくはpublic`のみ必須です。
そのため、最小の形は以下のようになります

```bash
public string name
```

#### 修飾子

その変数についての設定がなされます。
`public`/`private`以外は重ねて使うことができます。
|:-:          |:-:               |
| `@required` | 必須な引数にする(?) |
| `@global`   | グローバル変数にする |
| `@handleless` | ハンドラを生成しない |
| `public`    | パブリックなプロパティにする |
| `private`   | プライベートなプロパティにする(外部からアクセス不可...なはず) |

#### 初期化式

各プロパティの初期値を設定します。
これには、各型のクラスメゾットを使っての代入を行います。
詳細は、`lib/TypePrimitives/`以下のファイルを参照してください

| 文字列の初期化 | `<name> = <string>` |
| 配列の初期化   | `<name> set <string_1> <string_2>` |

尚、変数宣言と同時の代入の場合は少し異なり、以下のようになります

```bash
boolean name=value
```

なぜかはわかりませんが、`boolean`型のみ対応している模様です


## クラスのイニシャライズ

初期化というよりは、クラスを使えるようにするための宣言です。
（`bash`が元々クラスに対応していないため、特殊な操作が必要になります。）
とはいっても、これを実行するだけ

```bash
# クラス作成
Type::Initalize <class_name>
# 静的クラスにしたい場合は代わりにInitializeStaticを使う
Type::InitializeStatic <class_name>
```

これをすることで、クラスを使用することができるようになります

## インスタンスの作成

コンストラクタは現在存在しない模様。

```bash
<class_name> <instance_name>
```

例:

```bash
Person bob
```

## 静的クラスの利用

```bash
<class_name> <method>
<class_name> <property>
```