Previous << Type Hierarchy
Next >> Design Patterns
& (ampersand)
&
(アンパサンド)記号にはいくつかの用途があります。
Reference
式が&
(アンパサンド)記号で始まる場合、参照(reference)が作成されます。
let a: String = "hello"
let refOfA: &String = &a as &String
&
記号の前にauth
が付いている場合、参照(reference)も認証される場合があります(原文: may also be authorized)(そうでない場合は参照(reference)は認証されていません)。
許可された参照には、auth
修飾子と、参照(reference)が許可されている一連の権限が付いています。すなわち、完全な構文はauth(E, F) &T
であり、許可されていない参照(reference)には修飾子が付いていません。
let a: String = "hello"
let refOfA: auth(X) &String = &a as auth(X) &String
Logical Operator
また、2つ続けて記述することで、論理演算子(AND)としても使用できます(例:&&
)。
let a = true
let b = false
let c = a && b // false
@ (at)
タイプ名の前に@
(at)記号を付けると、そのタイプがリソースであるかどうかを注釈として示すことができます。
@
記号はタイプ名の先頭に付け、タイプ名の中には含めないようにしてください。例えば、NFT
の配列は@[NFT]
であり、[@NFT]
ではありません。これにより、タイプ全体がリソースとして機能することが強調されます。
/* 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
}
: (colon)
:
(コロン)記号にはいくつかの用途があります。
Type Declaration
:
(コロン)が変数/定数/関数の宣言の後に続く場合、その型の宣言に使用されます。
let a: Bool = true /* declares variable `a` with type `Bool` */
/* or */
fun addOne(x: Int): Int { /* return type of Int */
return x + 1
}
Ternary Conditional Operator
:
(コロン)は、3項演算でそうでなければの部分を表す場合にも使用されます。例えば、次のようになります。
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.
*/
= (equals)
=
(イコール)記号にはいくつかの用途があります。
Variable Declaration
let a = 1
/* declares a variable `a` with value `1` */
Assignment
a = 1
/* assigns the value `1` to variable `a ` */
! (exclamation mark)
!
記号は、変数の前にある場合と後にある場合で意味が異なります。
論理型変数の直前に置かれる場合、その変数を否定します。
let a: Bool = true
let b: Bool = !a
/* b is false */
オプショナル変数を即座に成功させる(値を保証させる)場合に、この記号は強制的にアンラップします。強制的にアンラップすると、オプションに値が含まれている場合はその値が返され、オプションに値が含まれていない場合、すなわちオプションの値が nil の場合は、パニックが発生して実行が中止されます。
let a: Int? = nil
let b: Int? = 3
let c: Int = a! /* panics, because = nil */
let d: Int = b! /* initialized correctly as 3 */
/ (forward slash)
/
(スラッシュ)記号にはいくつかの用途があります。
Division Operator
2つの数式の間では、スラッシュは割り算演算子として機能します。
let result = 4 / 2
Path separator
Pathでは、スラッシュはドメイン(storage
またはpublic
)および識別子を区切ります。
let storagePath = /storage/path
storagePath.toString()
/* is "\/storage\/path" */
<- (lower than, hyphen) (Move operator)
移動演算子<-
は代入演算子=
に似ていますが、値がリソース・オブジェクトである場合にのみ使用しなければなりません。リソースの代入を明示的に行うには、移動演算子<-
を使用しなければならないのは、以下の場合です。
- リソースが定数または変数の初期値である場合
- リソースが代入で別の変数に移動される場合
- リソースが引数として関数に移動される場合
- リソースが関数から返される場合
resource R {}
let a <- create R()
/* we instantiate a new resource and move it into a */
<-! (lower than, hyphen, exclamation mark) (Force-assignment move operator)
force-assignment 移動演算子 <-!
は、リソース値をオプショナル変数に移動します。変数がnilの場合、移動は成功します。変数がnil
でない場合、プログラムは中断します。
access(all)
resource R {}
var a: @R? <- nil
a <-! create R()
<-> (lower than, hyphen, greater than) (Swap operator)
スワップ演算子<->
は、その演算子の左右にある変数間で2つのリソースを入れ替えます。
+ (plus), - (minus), * (asterisk), % (percentage sign)
これらはすべて典型的な算術演算子です。
- 足し算:
+
- 引き算:
-
- 掛け算:
*
- 余り:
%
? (question mark)
?
(クエスチョンマーク)記号にはいくつかの用途があります。
Optional
変数/定数の後に?
)が付いている場合、オプショナルを表します。オプショナルには値がある場合と、全く何もない場合(原文: nothing at all)があります。
/* Declare a constant which has an optional integer type */
let a: Int? = nil
Ternary Conditional Operator
?
(クエスチョンマーク)は、3項演算で「then(であれば..)」の部分を表す場合にも使用されます。例えば、以下のような場合です。
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.
* /
Nil-Coalescing Operator
?
(クエスチョンマーク)は、nil結合演算子??
でも使用されます。
オプショナルに値が含まれている場合はその値を返し、オプショナルに値がない場合、つまりオプションナルの値がnilである場合は代替値を返します。
/* 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
_ (underscore)
_
(アンダースコア)記号にはいくつかの用途があります。
Names
_
(アンダースコア)は、変数や型などの名前に使用できます。
let _a = true /* used as a variable name */
let another_one = false
Number Literals
_
(アンダースコア)は、数値のコンポーネントを分割するのにも使用できます。
let b = 100_000_000
/* used to split up a number (supports all number types, e.g. 0b10_11_01) */
Argument Labels
_
(アンダースコア)は、関数内のパラメータに引数ラベルがないことを示す場合もあります。
/* 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)
翻訳元
Flow BlockchainのCadence version1.0ドキュメント (Glossary)