Glossary(記号)

[Previous << Type Hierarchy](https://qiita.com/flowcadence/items/69898a231128e74407b1)
[Next >> Design Patterns](https://qiita.com/flowcadence/items/bc0dad9850d2d6eaf7d2)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

<h1 id="&-(ampersand)">& (ampersand)</h1>

`&`（アンパサンド）記号にはいくつかの用途があります。

<h3>Reference</h3>

式が`&`（アンパサンド）記号で始まる場合、[参照(reference)](https://qiita.com/flowcadence/items/115d12a5deafc732636d)が作成されます。
```ruby
let a: String = "hello"
let refOfA: &String = &a as &String
```
`&`記号の前に`auth`が付いている場合、参照(reference)も認証される場合があります(原文: may also be authorized)（そうでない場合は参照(reference)は認証されていません）。
許可された参照には、`auth`修飾子と、参照(reference)が許可されている一連の権限が付いています。すなわち、完全な構文は`auth(E, F) &T`であり、許可されていない参照(reference)には修飾子が付いていません。
```ruby
let a: String = "hello"
let refOfA: auth(X) &String = &a as auth(X) &String
```

<h3>Logical Operator</h3>

また、2つ続けて記述することで、[論理演算子（AND）](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#logical-operators)としても使用できます（例：`&&`）。

```ruby
let a = true
let b = false

let c = a && b // false
```

<h1 id="@-(at)">@ (at)</h1>

タイプ名の前に`@`(at)記号を付けると、そのタイプが[リソース](https://qiita.com/flowcadence/items/f9b95df70c80a90d3a20)であるかどうかを注釈として示すことができます。

`@`記号はタイプ名の先頭に付け、タイプ名の中には含めないようにしてください。例えば、`NFT`の配列は`@[NFT]`であり、`[@NFT]`ではありません。これにより、タイプ全体がリソースとして機能することが強調されます。
```ruby
/* Declare a resource named `SomeResource` */
access(all)
resource SomeResource {
    
    access(all)
    var value: Int

    init(value: Int) {
        self.value = value
    }
}

/* we use the '@' symbol to reference a resource type */
let a: @SomeResource <- create SomeResource(value: 0)

/* also in functions declarations */
access(all)
fun use(resource: @SomeResource) {
    destroy resource
}
```

<h1 id=":-(colon)">: (colon)</h1>

`:`（コロン）記号にはいくつかの用途があります。
<h3>Type Declaration</h3>

`:`（コロン）が変数/定数/関数の宣言の後に続く場合、その型の宣言に使用されます。

```ruby
let a: Bool = true /* declares variable `a` with type `Bool` */

/* or */

fun addOne(x: Int): Int { /* return type of Int */
    return x + 1
}
```
<h3>Ternary Conditional Operator</h3>

`:`（コロン）は、3項演算で[そうでなければ](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#ternary-conditional-operator)の部分を表す場合にも使用されます。例えば、次のようになります。

```ruby
let a = 1 > 2 ? 3 : 4
/* should be read as:
 *   "is 1 greater than 2?"
 *   "if YES, then set a = 3,
 *   "otherwise, set a = 4.
 */
```

<h1 id="=-(equals)">= (equals)</h1>

`=`（イコール）記号にはいくつかの用途があります。

<h3>Variable Declaration</h3>

```ruby
let a = 1
/* declares a variable `a` with value `1` */
```

<h3>Assignment</h3>

```ruby
a = 1 
/* assigns the value `1` to variable `a ` */
```

<h1 id="!-(exclamation-mark)">! (exclamation mark)</h1>

`!`記号は、変数の前にある場合と後にある場合で意味が異なります。
論理型変数の直前に置かれる場合、その変数を否定します。
```ruby
let a: Bool = true
let b: Bool = !a

/* b is false */
```
オプショナル変数を即座に成功させる(値を保証させる)場合に、この記号は[強制的にアンラップ](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#force-unwrap-operator-)します。強制的にアンラップすると、オプションに値が含まれている場合はその値が返され、オプションに値が含まれていない場合、すなわちオプションの値が nil の場合は、パニックが発生して実行が中止されます。
```ruby
let a: Int? = nil
let b: Int? = 3

let c: Int = a! /* panics, because = nil */
let d: Int = b! /* initialized correctly as 3 */
```

<h1 id="/-(forward-slash)">/ (forward slash)</h1>

`/`（スラッシュ）記号にはいくつかの用途があります。

<h3>Division Operator</h3>

2つの数式の間では、スラッシュは[割り算演算子](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#arithmetic-operators)として機能します。

```ruby
let result = 4 / 2
```

<h3>Path separator</h3>

[Path](https://qiita.com/flowcadence/items/9767ec3f9b8d757d75bf)では、スラッシュはドメイン(`storage`または`public`)および識別子を区切ります。

```ruby
let storagePath = /storage/path
storagePath.toString()
/* is "\/storage\/path" */
```

<h1 id="<--(lower-than,-hyphen)-(Move-operator)"><- (lower than, hyphen) (Move operator)</h1>

[移動演算子`<-`](https://qiita.com/flowcadence/items/f9b95df70c80a90d3a20#the-move-operator)は代入演算子`=`に似ていますが、値がリソース・オブジェクトである場合にのみ使用しなければなりません。[リソース](https://qiita.com/flowcadence/items/f9b95df70c80a90d3a20)の代入を明示的に行うには、移動演算子`<-`を使用しなければならないのは、以下の場合です。
  - リソースが定数または変数の初期値である場合
  - リソースが代入で別の変数に移動される場合
  - リソースが引数として関数に移動される場合
  - リソースが関数から返される場合
```ruby
resource R {}

let a <- create R()
/* we instantiate a new resource and move it into a */
```

<h1 id="<-!-(lower-than,-hyphen,-exclamation-mark)-(Force-assignment-move-operator)"><-! (lower than, hyphen, exclamation mark) (Force-assignment move operator)</h1>

[force-assignment 移動演算子 `<-!`](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#force-assignment-operator--) は、リソース値をオプショナル変数に移動します。変数がnilの場合、移動は成功します。変数が`nil`でない場合、プログラムは中断します。

```ruby
access(all)
resource R {}

var a: @R? <- nil
a <-! create R()
```

<h1 id="<->-(lower-than,-hyphen,-greater-than)-(Swap-operator)"><-> (lower than, hyphen, greater than) (Swap operator)</h1>

[スワップ演算子`<->`](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#swapping-operator--)は、その演算子の左右にある変数間で2つのリソースを入れ替えます。

<h1 id="+-(plus),---(minus),-*-(asterisk),-%-(percentage-sign)">+ (plus), - (minus), * (asterisk), % (percentage sign)</h1>

これらはすべて典型的な[算術演算子](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#arithmetic-operators)です。
  - 足し算：`+`
  - 引き算：`-`
  - 掛け算：`*`
  - 余り：`%`

<h1 id="?-(question-mark)">? (question mark)</h1>

`?`（クエスチョンマーク）記号にはいくつかの用途があります。

<h3>Optional</h3>

変数/定数の後に`?`）が付いている場合、オプショナルを表します。オプショナルには値がある場合と、全く何もない場合(原文: *nothing at all*)があります。

```ruby
/* Declare a constant which has an optional integer type */
let a: Int? = nil
```

<h3>Ternary Conditional Operator</h3>

`?`（クエスチョンマーク）は、[3項演算](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#ternary-conditional-operator)で「then(であれば..)」の部分を表す場合にも使用されます。例えば、以下のような場合です。

```ruby
let a = 1 > 2 ? 3 : 4
/* should be read as:
 *   "is 1 greater than 2?"
 *   "if YES, then set a = 3,
 *   "otherwise, set a = 4.
 * /
```

<h1 id="Nil-Coalescing-Operator">Nil-Coalescing Operator</h1>

`?`（クエスチョンマーク）は、[nil結合演算子`??`](https://qiita.com/flowcadence/items/3220cbef5b83f3d27f7a#nil-coalescing-operator-)でも使用されます。

オプショナルに値が含まれている場合はその値を返し、オプショナルに値がない場合、つまりオプションナルの値がnilである場合は代替値を返します。

```ruby
/* Declare a constant which has an optional integer type */
let a: Int? = nil

/* Declare a constant with a non-optional integer type,
 * which is initialized to `a` if it is non-nil, or 42 otherwise.
 */
let b: Int = a ?? 42
/* `b` is 42, as `a` is nil */


/* Invalid: nil-coalescing operator is applied to a value which has a non-optional type
 * (the integer literal is of type `Int`).
 */
let c = 1 ?? 2
```


<h1 id="_-(underscore)">_ (underscore)</h1>

`_`（アンダースコア）記号にはいくつかの用途があります。

<h3>Names</h3>

`_`（アンダースコア）は、変数や型などの名前に使用できます。

```ruby
let _a = true /* used as a variable name */
let another_one = false
```

<h3>Number Literals</h3>

`_`（アンダースコア）は、数値のコンポーネントを分割するのにも使用できます。

```ruby
let b = 100_000_000
/* used to split up a number (supports all number types, e.g. 0b10_11_01) */
```

<h3>Argument Labels</h3>

`_`（アンダースコア）は、[関数](https://qiita.com/flowcadence/items/6518644e68d32b032530)内のパラメータに引数ラベルがないことを示す場合もあります。

```ruby
/* The special argument label _ is specified for the parameter,
 * so no argument label has to be provided in a function call. */

fun double(_ x: Int): Int {
    return x * 2
}

let result = double(4)
```

翻訳元

https://cadence-lang.org/docs/language/glossary

***
<b>[Previous << Type Hierarchy](https://qiita.com/flowcadence/items/69898a231128e74407b1)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Glossary)

<b>[Next >> Design Patterns](https://qiita.com/flowcadence/items/bc0dad9850d2d6eaf7d2)</b>