Skip to main content
变量 用于为值命名并保存计算结果,引用运算符 & 用于在表达式中读取变量值。本章覆盖赋值、复合赋值、 引用与作用域要点。

基本赋值

想复用中间结果时,可以把值赋给变量。使用 = 即可创建或更新变量:
x = 5
message = "hello"
result = 'fail'
要点如下:
  • 不需要 varlet 等关键字,直接写 name = expression 即可创建或更新变量。
  • 对同名变量再次赋值会覆盖先前的值,后一次赋值生效。
除了最基础的 = 赋值外,Fluxon 还支持常见的复合赋值运算符:
counter = 0
counter += 1
total *= 2
其语义与大多数 JVM 语言保持一致,相当于在 原有值 的基础上就地更新。

引用运算符 &

在 Fluxon 中,始终显式区分「变量本身」和「变量里的值」。在表达式中读取变量的值时,需要在变量名前添加 &, 表示「取出该变量当前绑定的值」:
x = 10
y = &x + 5
result = &result + &i
使用 & 时需要注意:
  • &name 可以出现在任意表达式的位置,用于取出当前作用域中对应变量的值。
  • 赋值语句左侧始终写作 name = ...,不会出现 &name = ... 这样的形式。
  • 在函数体或控制流结构(如循环、分支)内部使用 &,可以直接访问外层已存在的变量。
一个常见的出错场景是「忘记写 &」:
name = "world"
greeting = "hello " + name   // 这里的 name 会被当作字符串字面量
// 正确写法:
greeting = "hello " + &name

作用域要点

Fluxon 的多种语法结构都会引入新的作用域:
  • forwhen 等控制流结构以及函数体都会形成各自的作用域。
  • 在这些结构内部新建的变量,默认只在本作用域内可见。
如果希望在循环或分支内部计算得到的结果在外层同样可用,通常的写法是:
  1. 在外层先声明并初始化变量。
  2. 在内部作用域中,通过赋值对该变量进行累积或更新。
sum = 0
for i in 1..3 {
    sum += &i
}
// 退出循环后,sum 仍可在外层使用
如果把累加结果写成循环内部的新变量,那么外层就无法使用它:
for i in 1..3 {
  innerSum = &i    // innerSum 只在循环体内部可见
}
// 这里访问 innerSum 会出错,因为它超出了作用域

条件分支中的作用域

when 或其他分支结构体内定义的变量,默认只在对应分支中可见:
message = ""
when &status {
  "ok" -> {
    message = "success"      // 直接更新外层变量
  }
  "fail" -> {
    message = "failed"       // 同样更新外层变量
  }
}

// 这里可以使用更新后的 message
log = &message + "!"
在分支内部如果使用 localMsg = ... 这样的新变量名,则该变量只在当前分支块内有效,外层无法访问。

函数与嵌套作用域

函数体同样形成自己的作用域,函数参数和在函数内声明的变量不会泄漏到外层:
def add(a, b) = {
    result = &a + &b
    return &result
}

sum = add(1, 2)
// 这里看不到 result,只能看到 sum
在多层嵌套结构中,内层可以通过 & 引用外层变量,但应避免复用相同的变量名,从而遮蔽外层含义:
value = 10

for i in 1..2 {
    // 避免再次使用 value 作为循环内部变量名
    inner = &value + &i
}
如果在内层重新声明了同名变量,就会发生「变量遮蔽」(shadowing):
value = 10

for i in 1..2 {
  value = 100       // 这里修改的是内层 value,而不是外层的 10
}

相关链接