[UEFN][Verse] Verse言語の配列/arrayをC#と比較しながら完全に理解したい。

こんにちは、Unity/Unrealエンジニアの[イワケン](https://twitter.com/iwaken71)です。
最近はUEFNを楽しんでいます。

さて、UEFN(Fortnite)でマップを作る際にVerse言語を使えるわけですが、プログラミング言語の基本である「配列(array)」も「クセつよ！」です。なので完全に理解するために、ドキュメントを解説しつつ、私の好きな言語「C#」と比較しながら、具体例のコードで理解していきたいと思います。

# Verse配列理解の3行まとめ

- コードのスタイルガイドの違いに気を付けろ
- 配列の要素はif文の中で使おう
- 値を更新する時は、varで宣言。setで更新


# 今回の参考ドキュメント

Verse言語の配列

https://dev.epicgames.com/documentation/ja-jp/uefn/array-in-verse


C#の配列

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/arrays

# 配列とは

そもそも配列とはという話なのですが、目的としては **「同じ型の複数の値や変数を管理する」** があげられます。

# VerseとC#のスタイルガイドの違い

VerseとC#はコードスタイルが違います。てかほぼ逆です。なのでUnityエンジニアは最初混乱します。

https://dev.epicgames.com/documentation/ja-jp/uefn/verse-code-style-guide-in-unreal-editor-for-fortnite

https://learn.microsoft.com/ja-jp/dotnet/standard/design-guidelines/capitalization-conventions

||Verse|C#|
|---|---|---|
|型名|lower_snake_case|PascalCase|
|変数名|PascalCase|camelCase or PascalCase|

コードスタイルは強制ではないですが、慣習的にこのようなことが多いようです。
慣れていきましょう。

# 宣言の文法

それぞれ見ていきましょう

```python:verseの配列
変数名 : []型 = arrau{}
ArrayName1 : []type = array{}
ArrayName2 : []int = array{1, 2, 3, 4, 5}
ArrayName2.Length # 5
ArrayName2[2] # 3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/7be50978-b4dc-2a69-fb47-c976dc6d8a11.png)

```csharp:c#の配列
型[] 変数名;
type[] ArrayName1;
int[] ArrayName2 = { 1, 2, 3, 4, 5 };
ArrayName2.Length // 5
ArrayName2[2] // 3
int[] ArrayName3 = new int[5];
```

型名と変数名の書く位置が逆なので、気を付けてください。

## Verseには new int[5]という書き方がない？

ないっぽいです。もし見つけたら教えてください。

# 配列の値の使い方


```python:verseの配列
ExampleArray : []int = array{1, 2, 3, 4, 5}
for (Index := 0..ExampleArray.Length-1):
    if (Element := ExampleArray[Index]):
        Print("{Element} in ExampleArray at index {Index}")
```

```csharp:c#の配列
int[] exampleArray = new { 1, 2, 3, 4, 5 };
for (int i = 0; i < exampleArray.Length; i++){
    Console.WriteLine(exampleArray[i]);
}
```

Verse言語の配列の要素へのアクセス は **「失敗する可能性がある式 (failable expression)」** であり、`if文`などの **「失敗コンテキスト (failure context)」** でしか使用することができません。ここがVerse言語の特殊な部分です。

先ほどの例だと

```python:verseの配列の要素は失敗コンテキストの中のみで使用可能
if (Element := ExampleArray[Index]):
    # 何か書く
```

これがC#など他の言語との大きな違いです。
まぁとりあえず「if文で書かないといけない」と覚えておけば最初は良い気がします。

失敗コンテキストについては別の記事で解説出来たらと思います。

# 配列の要素を変更する

```python:verseの配列
var ExampleArray : []int = array{1, 2, 3, 4, 5}
set ExampleArray[1] = 20
# array{1, 20, 3, 4, 5}
```

```csharp:c#の配列
int[] exampleArray = new { 1, 2, 3, 4, 5 };
exampleArray[1] = 20;
// 1,20,3,4,5
```

**Verseで配列の値を変更する場合、**

- varで宣言
- setつきで変更

ということを気を付ける必要があります。

# 多次元配列

おまけで多次元配列も見ていきましょう。

```python:verseの配列
var Counter : int = 0
Example : [][]int =
    for (Row := 0..3):
        for(Column := 0..2):
            set Counter += 1
if (NumberOfColumns : int = Example[0].Length):
    for(Row := 0..Example.Length-1, Column := 0..NumberOfColumns):
         if (Element := Example[Row][Column]):
             Print("{Element} at index [{Row}][{Column}]")
```
出力は

```
    1 at index [0][0]
    2 at index [0][1]
    3 at index [0][2]
    4 at index [1][0]
    5 at index [1][1]
    6 at index [1][2]
    7 at index [2][0]
    8 at index [2][1]
    9 at index [2][2]
    10 at index [3][0]
    11 at index [3][1]
    12 at index [3][2]
```

```csharp:c#の配列
int[,] Example = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12} };

for (int i = 0;i < Example.GetLength(0); i++){
    for (int j = 0; j < Example.GetLength(1); j++){
         System.Console.WriteLine("Element({0},{1})={2}", i, j, Example[i, j]);
    }
}
```

出力は

```
/* Output:
    Element(0,0)=1
    Element(0,1)=2
    Element(0,2)=3
    Element(1,0)=4
    Element(1,1)=5
    Element(1,2)=6
    Element(2,0)=7
    Element(2,1)=8
    Element(2,2)=9
    Element(3,0)=10
    Element(3,1)=11
    Element(4,2)=12
*/
```
# 余談: 値型か参照型か

配列と言えば参照型という私の感覚なのですが、Verseの配列は値型なのでは...? というXポストを見かけたのですが、まだ検証していません。詳しい人教えてください。

# まとめ

本記事では、Verse言語の配列/arrayを理解するためにC#と比較しながら注意ポイントをまとめてみました。

3行まとめはこちら

- コードのスタイルガイドの違いに気を付けろ
- 配列の要素はif文の中で使おう
- 値を更新する時は、varで宣言。setで更新

では、楽しいVerseライフを！