すべての関数およびブロック ({...}) は、宣言用の新しいスコープを導入します。各関数およびブロックは、そのスコープ内または外部のスコープ内の宣言を参照できます。
let x = 10
fun f(): Int {
let y = 10
return x + y
}
f() // is `20`
// Invalid: the identifier `y` is not in scope.
//
y
fun doubleAndAddOne(_ n: Int): Int {
fun double(_ x: Int) {
return x * 2
}
return double(n) + 1
}
// Invalid: the identifier `double` is not in scope.
//
double(1)
各スコープは新しい宣言を導入することができ、すなわち、外側の宣言が覆い隠されます。
let x = 2
fun test(): Int {
let x = 3
return x
}
test() // is `3`
スコープは字句的であり、動的ではありません。
let x = 10
fun f(): Int {
return x
}
fun g(): Int {
let x = 20
return f()
}
g() // is `10`, not `20`
宣言は、囲む関数の上に影響(hoist)しません。
let x = 2
fun f(): Int {
if x == 0 {
let x = 3
return x
}
return x
}
f() // is `2`
翻訳元->https://cadence-lang.org/docs/language/scope