Program Structure
Inspect one language lane at a time so line-level text and code deltas stay readable.
Diff Lane
English
0 modified sections0 code block delta0 anchor delta
Diff Lane
中文
1 modified sections0 code block delta0 anchor delta
modified变量textcode+3 lines, -2 lines
v1.0.5
Section Text
1
在仓颉编程语言中,一个变量由对应的变量名、数据(值)和若干属性构成,开发者通过变量名访问变量对应的数据,但访问操作需要遵从相关属性的约束(如数据类型、可变性和可见性等)。2
3
变量定义的具体形式为:4
5
6
其中**修饰符**用于设置变量的各类属性,可以有一个或多个,常用的修饰符包括:7
8
- 可变性修饰符:`let` 与 `var`,分别对应不可变和可变属性,可变性决定了变量被初始化后其值还能否改变,仓颉变量也由此分为不可变变量和可变变量两类。9
- `const` 修饰符:`const` 是一种特殊的变量修饰符。它用于声明常量,要求在声明时必须初始化,一旦被赋值,其值就不能被改变。这与`let` 修饰符类似,都具有不可变的特性,但`const` 在使用上有更严格的限制。10
- 可见性修饰符:`private` 与 `public` 等,影响全局变量和成员变量的可引用范围,详见后续章节的相关介绍。11
- 静态性修饰符:`static`,影响成员变量的存储和引用方式,详见后续章节的相关介绍。12
13
变量均支持赋值操作符(`=`),与类型无关。`let` 修饰的变量只能被赋值一次,即初始化;`var` 修饰的变量可以被多次赋值。14
15
在定义仓颉变量时,可变性修饰符是必要的,在此基础上,还可以根据需要添加其他修饰符。16
17
- **变量名**应是一个合法的仓颉标识符。18
- **变量类型**指定了变量所持有数据的类型。当初始值具有明确类型时,可以省略变量类型标注,此时编译器可以自动推断出变量类型。19
- **初始值**是一个仓颉表达式,用于初始化变量,如果标注了变量类型,需要保证初始值类型和变量类型一致。在定义全局变量或静态成员变量时,必须指定初始值。在定义局部变量或实例成员变量时,可以省略初始值,但需要标注变量类型,同时要在此变量被引用前完成初始化,否则编译会报错。20
21
例如,下列程序定义了三个 `Int64` 类型的变量(分别为不可变变量 `a` 、可变变量 `b` 和 const 变量 `c` )。随后修改了变量 `b` 的值,同时将 `b` 的值赋值给`a`,并调用 `println` 函数打印 `a`, `b` 和`c` 的值。22
23
<!-- verify -->24
25
26
编译运行此程序,将输出:27
28
29
如果尝试修改不可变变量,编译时会报错,例如:30
31
<!-- compile.error -->32
33
34
当初始值具有明确类型时,可以省略变量类型标注,例如:35
36
<!-- verify -->37
38
39
其中变量 `b` 的类型可以由其初值 `a` 的类型自动推断为 `Int64`,所以此程序也可以被正常编译和运行,将输出:40
41
42
在定义局部变量时,可以不进行初始化,但一定要在变量被引用前赋予初值,例如:43
44
<!-- verify -->45
46
47
编译运行此程序,将输出:48
49
50
在定义全局变量和静态成员变量时必须初始化,否则编译会报错,例如:51
52
<!-- compile.error -->53
54
55
<!-- compile.error -->56
57
58
需要注意的是,当编译器无法判断某些场景是否一定会被初始化或无法判断是否重复初始化了不可变变量时,会倾向于保守策略进行编译报错,见如下示例:59
60
<!-- compile.error -->61
62
63
此外,对于 [try-catch](../error_handle/handle.md#普通-try-表达式) 场景,编译器会假设 try 块总是全部被执行,且总是抛异常,从而进行相关报错,见如下示例:64
<!-- compile.error -->Code 1 · text
1
修饰符 变量名: 变量类型 = 初始值Code 2 · cangjie
1
main() {2
let a: Int643
var b: Int64 = 144
const c: Int64 = 135
b = 126
a = b // A variable modified by let can only be assigned once, that is, initialized7
println("${a}, ${b}, ${c}")8
}Code 3 · text
1
12, 12, 13Code 4 · cangjie
1
main() {2
let pi: Float64 = 3.141593
pi = 2.71828 // Error, cannot assign to immutable value4
}Code 5 · cangjie
1
main() {2
let a: Int64 = 20233
let b = a4
println("a - b = ${a - b}")5
}Code 6 · text
1
a - b = 0Code 7 · cangjie
1
main() {2
let text: String3
text = "仓颉造字"4
println(text)5
}Code 8 · text
1
仓颉造字Code 9 · cangjie
1
let global: Int64 // Error, variable in top-level scope must be initialized2
3
main(): Unit{4
5
}Code 10 · cangjie
1
class Player {2
static let score: Int32 // Error, static variable 'score' needs to be initialized when declaring3
}Code 11 · cangjie
1
func calc(a: Int32){2
println(a)3
return a * a4
}5
main() {6
let a: String7
if(calc(32) == 0){8
a = "1"9
}10
a = "2" // Error, cannot assign to immutable value11
}Code 12 · cangjie
1
main() {2
let a: String3
try {4
a = "1"5
} catch (_) {6
a = "2" // Error, cannot assign to immutable value7
}8
}Code 13 · cangjie
1
v1.1.0
Section Text
1
在仓颉编程语言中,一个变量由对应的变量名、数据(值)和若干属性构成,开发者通过变量名访问变量对应的数据,但访问操作需要遵从相关属性的约束(如数据类型、可变性和可见性等)。2
3
变量定义的具体形式为:4
5
6
其中**修饰符**用于设置变量的各类属性,可以有一个或多个,常用的修饰符包括:7
8
- 可变性修饰符:`let` 与 `var`,分别对应不可变和可变属性,可变性决定了变量被初始化后其值还能否改变,仓颉变量也由此分为不可变变量和可变变量两类。9
- `const` 修饰符:`const` 是一种特殊的变量修饰符。它用于声明常量,要求在声明时必须初始化,一旦被赋值,其值就不能被改变。这与 `let` 修饰符类似,都具有不可变的特性,但 `const` 在使用上有更严格的限制。10
- 可见性修饰符:`private` 与 `public` 等,影响全局变量和成员变量的可引用范围,详见后续章节的相关介绍。11
- 静态性修饰符:`static`,影响成员变量的存储和引用方式,详见后续章节的相关介绍。12
13
变量均支持赋值操作符(`=`),与类型无关。`let` 修饰的变量只能被赋值一次,即初始化;`var` 修饰的变量可以被多次赋值。14
15
在定义仓颉变量时,可变性修饰符是必要的,在此基础上,还可以根据需要添加其他修饰符。16
17
- **变量名**应是一个合法的仓颉标识符。18
- **变量类型**指定了变量所持有数据的类型。当初始值具有明确类型时,可以省略变量类型标注,此时编译器可以自动推断出变量类型。19
- **初始值**是一个仓颉表达式,用于初始化变量,如果标注了变量类型,需要保证初始值类型和变量类型一致。在定义全局变量或静态成员变量时,必须指定初始值。在定义局部变量或实例成员变量时,可以省略初始值,但需要标注变量类型,同时要在此变量被引用前完成初始化,否则编译会报错。20
21
例如,下列程序定义了三个 `Int64` 类型的变量(分别为不可变变量 `a` 、可变变量 `b` 和 const 变量 `c` )。随后修改了变量 `b` 的值,同时将 `b` 的值赋值给 `a`,并调用 `println` 函数打印 `a`, `b` 和 `c` 的值。22
23
<!-- verify -->24
25
26
编译运行此程序,将输出:27
28
29
如果尝试修改不可变变量,编译时会报错,例如:30
31
<!-- compile.error -->32
33
34
当初始值具有明确类型时,可以省略变量类型标注,例如:35
36
<!-- verify -->37
38
39
其中变量 `b` 的类型可以由其初值 `a` 的类型自动推断为 `Int64`,所以此程序也可以被正常编译和运行,将输出:40
41
42
在定义局部变量时,可以不进行初始化,但一定要在变量被引用前赋予初值,例如:43
44
<!-- verify -->45
46
47
编译运行此程序,将输出:48
49
50
在定义全局变量和静态成员变量时必须初始化,否则编译会报错,例如:51
52
<!-- compile.error -->53
54
55
<!-- compile.error -->56
57
58
需要注意的是,当编译器无法判断某些场景是否一定会被初始化或无法判断是否重复初始化了不可变变量时,会倾向于保守策略进行编译报错,见如下示例:59
60
<!-- compile.error -->61
62
63
当静态成员变量的赋值出现在函数或 [lambda](../function/lambda.md) 内时,编译器在编译期无法确定该函数或 `lambda` 是否会被执行,因此通常采用保守策略报错。示例如下:64
65
<!-- compile.error -->66
67
68
此外,对于 [try-catch](../error_handle/handle.md#普通-try-表达式) 场景,编译器会假设 try 块总是全部被执行,且总是抛异常,从而进行相关报错,见如下示例:69
<!-- compile.error -->Code 1 · text
1
修饰符 变量名: 变量类型 = 初始值Code 2 · cangjie
1
main() {2
let a: Int643
var b: Int64 = 144
const c: Int64 = 135
b = 126
a = b // A variable modified by let can only be assigned once, that is, initialized7
println("${a}, ${b}, ${c}")8
}Code 3 · text
1
12, 12, 13Code 4 · cangjie
1
main() {2
let pi: Float64 = 3.141593
pi = 2.71828 // Error, cannot assign to immutable value4
}Code 5 · cangjie
1
main() {2
let a: Int64 = 20233
let b = a4
println("a - b = ${a - b}")5
}Code 6 · text
1
a - b = 0Code 7 · cangjie
1
main() {2
let text: String3
text = "仓颉造字"4
println(text)5
}Code 8 · text
1
仓颉造字Code 9 · cangjie
1
let global: Int64 // Error, variable in top-level scope must be initialized2
3
main(): Unit{4
5
}Code 10 · cangjie
1
class Player {2
static let score: Int32 // Error, static variable 'score' needs to be initialized when declaring3
}Code 11 · cangjie
1
func calc(a: Int32){2
println(a)3
return a * a4
}5
main() {6
let a: String7
if(calc(32) == 0){8
a = "1"9
}10
a = "2" // Error, cannot assign to immutable value11
}Code 12 · cangjie
1
func foo(a: () -> Unit){2
// 业务逻辑处理3
}4
5
class A {6
public static var ctx: Int64 // 编译报错,静态变量 ctx 没有初始化7
8
static init() {9
let lambda = {=> ctx = 10}10
foo(lambda)11
}12
}13
14
main() {}Code 13 · cangjie
1
main() {2
let a: String3
try {4
a = "1"5
} catch (_) {6
a = "2" // Error, cannot assign to immutable value7
}8
}