2.12 高级特性
December 6, 2025 · View on GitHub
CovScript 提供了一系列高级特性,让开发更加灵活和高效。本章介绍一些高级编程技巧和语言特性,包括范围函数、链式调用、元编程等。
兼容性说明: 本章内容大部分在 ECS 和 CSC 中都可用,特殊的 ECS 专有特性会特别标注。
2.12.2 范围函数(range)
range 函数生成数字序列。
# 基本范围
foreach i in range(5)
system.out.println(i) # 0, 1, 2, 3, 4
end
# 指定起始和结束
foreach i in range(1, 6)
system.out.println(i) # 1, 2, 3, 4, 5
end
# 指定步长
foreach i in range(0, 10, 2)
system.out.println(i) # 0, 2, 4, 6, 8
end
# 倒序范围
foreach i in range(10, 0, -1)
system.out.println(i) # 10, 9, 8, ..., 1
end
range 的实际应用
# 生成序列
var numbers = new list
foreach i in range(1, 11)
numbers.push_back(i)
end
# 批量操作
foreach i in range(100)
var filename = "file_" + to_string(i) + ".txt"
# 处理文件
end
# 矩阵初始化
var matrix = new list
foreach i in range(5)
var row = new list
foreach j in range(5)
row.push_back(0)
end
matrix.push_back(row)
end
2.12.3 链式调用
方法返回 this 实现链式调用。
class StringBuilder
var buffer = ""
function append(text)
this.buffer += text
return this
end
function appendLine(text)
this.buffer += text + "\n"
return this
end
function clear()
this.buffer = ""
return this
end
function toString()
return this.buffer
end
end
# 链式调用
var sb = new StringBuilder
var result = sb.append("Hello")
.append(" ")
.append("World")
.appendLine("!")
.append("How are you?")
.toString()
system.out.println(result)
流式API
class Query
var data = null
var filtered = null
function construct(arr)
this.data = arr
this.filtered = arr
end
function where(predicate)
var result = new list
foreach item in this.filtered
if predicate(item)
result.push_back(item)
end
end
this.filtered = result
return this
end
function select(mapper)
var result = new list
foreach item in this.filtered
result.push_back(mapper(item))
end
this.filtered = result
return this
end
function toList()
return this.filtered
end
end
# 使用流式API
var numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var result = new Query{numbers}
.where([](x) -> x % 2 == 0) # 筛选偶数
.select([](x) -> x * x) # 平方
.toList()
foreach num in result
system.out.println(num) # 4, 16, 36, 64, 100
end
2.12.4 初始化列表
使用 {} 语法快速初始化容器。
# 数组初始化
var numbers = {1, 2, 3, 4, 5}
var names = {"Alice", "Bob", "Charlie"}
var mixed = {1, "two", 3.0, true}
# 嵌套初始化
var matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
# 访问嵌套元素
system.out.println(matrix[0][0]) # 1
system.out.println(matrix[1][2]) # 6
# 空数组
var empty = {}
结构化数据
# 配置对象
var config = {
"host": "localhost",
"port": 8080,
"timeout": 30,
"retries": 3
}
# 记录列表
var users = {
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 35}
}
2.12.5 克隆(clone)
复制对象,创建独立副本。
# 克隆数组
var original = {1, 2, 3, 4, 5}
var copy = clone(original)
copy[0] = 100
system.out.println(original[0]) # 1(原始未改变)
system.out.println(copy[0]) # 100
# 克隆列表
var list1 = new list
list1.push_back(1)
list1.push_back(2)
list1.push_back(3)
var list2 = clone(list1)
list2.push_back(4)
system.out.println(list1.size) # 3
system.out.println(list2.size) # 4
# 克隆对象
class Point
var x = 0
var y = 0
end
var p1 = new Point
p1.x = 10
p1.y = 20
var p2 = clone(p1)
p2.x = 30
system.out.println(p1.x) # 10
system.out.println(p2.x) # 30
深拷贝与浅拷贝
# 浅拷贝(引用相同的对象)
var data1 = {
"name": "Alice",
"scores": {90, 85, 95}
}
var data2 = data1 # 浅拷贝,共享引用
data2["name"] = "Bob"
# 修改会影响原始数据
# 深拷贝(完全独立的副本)
function deepClone(obj)
# 实现深拷贝逻辑
if typeid obj == typeid {}
var result = {}
foreach item in obj
result.push_back(deepClone(item))
end
return result
else
return clone(obj)
end
end
2.12.6 类型转换(as)
使用 as 进行类型转换(如果支持)。
# 安全类型转换
var value = "123"
var num = value as number # 转换为数字
# 对象类型转换
class Base
end
class Derived extends Base
end
var obj = new Derived
var base = obj as Base # 向上转换
2.12.7 操作符重载
为自定义类型重载操作符(根据语言支持)。
class Vector
var x = 0
var y = 0
function construct(a, b)
this.x = a
this.y = b
end
# 重载加法(概念示例)
function add(other)
return new Vector{this.x + other.x, this.y + other.y}
end
# 重载乘法
function multiply(scalar)
return new Vector{this.x * scalar, this.y * scalar}
end
function toString()
return "(" + to_string(this.x) + ", " + to_string(this.y) + ")"
end
end
var v1 = new Vector{1, 2}
var v2 = new Vector{3, 4}
var v3 = v1.add(v2)
var v4 = v1.multiply(2)
system.out.println(v3.toString()) # (4, 6)
system.out.println(v4.toString()) # (2, 4)
2.12.9 模式匹配(概念)
使用 switch 和条件实现模式匹配。
function processValue(value)
# 类型匹配
if typeid value == typeid 0
system.out.println("Number: " + to_string(value))
else if typeid value == typeid ""
system.out.println("String: " + value)
else if typeid value == typeid {}
system.out.println("Array with " + to_string(value.size) + " elements")
else
system.out.println("Unknown type")
end
end
# 值匹配
function processCommand(cmd)
switch cmd
case "start"
startService()
end
case "stop"
stopService()
end
case "restart"
stopService()
startService()
end
default
system.out.println("Unknown command")
end
end
end
2.12.10 装饰器模式
使用高阶函数实现装饰器。
# 计时装饰器
function timed(func)
return [](...args) {
var start = runtime.time()
var result = func(...args)
var end = runtime.time()
system.out.println("Execution time: " + to_string(end - start) + "ms")
return result
}
end
# 日志装饰器
function logged(func)
return [](...args) {
system.out.println("Calling function with args: " + to_string(args))
var result = func(...args)
system.out.println("Function returned: " + to_string(result))
return result
}
end
# 使用装饰器
function slowFunction(n)
runtime.delay(1000)
return n * n
end
var decoratedFunc = timed(logged(slowFunction))
var result = decoratedFunc(5)
2.12.11 惰性求值
实现延迟计算。
class Lazy
var computer = null
var value = null
var computed = false
function construct(func)
this.computer = func
this.computed = false
end
function get()
if !this.computed
this.value = this.computer()
this.computed = true
end
return this.value
end
end
# 使用惰性求值
var expensive = new Lazy{[]() {
system.out.println("Computing expensive value...")
runtime.delay(2000)
return 42
}}
system.out.println("Created lazy value")
# 这里不会计算
system.out.println("Getting value...")
var result = expensive.get() # 第一次调用时计算
system.out.println("Result: " + to_string(result))
var result2 = expensive.get() # 使用缓存的值
system.out.println("Result2: " + to_string(result2))
2.12.12 管道操作
实现函数组合和数据管道。
class Pipeline
var value = null
function construct(v)
this.value = v
end
function pipe(func)
this.value = func(this.value)
return this
end
function get()
return this.value
end
end
# 使用管道
var result = new Pipeline{10}
.pipe([](x) -> x * 2) # 20
.pipe([](x) -> x + 5) # 25
.pipe([](x) -> x * x) # 625
.get()
system.out.println("Result: " + to_string(result))
# 字符串处理管道
function uppercase(str)
# 转大写实现
return str
end
function trim(str)
# 去空格实现
return str
end
function reverse(str)
# 反转实现
var result = ""
for i = str.size - 1, i >= 0, --i
result += str[i]
end
return result
end
var processed = new Pipeline{" hello world "}
.pipe(trim)
.pipe(uppercase)
.pipe(reverse)
.get()
高级特性最佳实践
- 合理使用 do 表达式:简化复杂的初始化逻辑
- 链式调用提高可读性:设计流畅的API
- 注意克隆的性能开销:大对象克隆成本高
- 元编程需谨慎:过度使用会降低代码可维护性
- 装饰器模式分离关注点:增强功能而不修改原始代码
# 综合示例:构建器模式
class QueryBuilder
var table = ""
var columns = new list
var whereClause = ""
var orderBy = ""
var limit = -1
function from(tableName)
this.table = tableName
return this
end
function select(cols)
this.columns = cols
return this
end
function where(condition)
this.whereClause = condition
return this
end
function order(field)
this.orderBy = field
return this
end
function limitTo(n)
this.limit = n
return this
end
function build()
var sql = "SELECT "
if this.columns.size == 0
sql += "*"
else
sql += join(this.columns, ", ")
end
sql += " FROM " + this.table
if !this.whereClause.empty()
sql += " WHERE " + this.whereClause
end
if !this.orderBy.empty()
sql += " ORDER BY " + this.orderBy
end
if this.limit > 0
sql += " LIMIT " + to_string(this.limit)
end
return sql
end
end
# 使用构建器
var query = new QueryBuilder{}
.from("users")
.select({"id", "name", "email"})
.where("age > 18")
.order("name")
.limitTo(10)
.build()
system.out.println(query)