如何在Rust中定义声明层面可修改的变量,实现C++全局变量等效功能
你实现的基于结构体封装状态的方案已经符合Rust的编程规范,也是Rust官方优先推荐的实现思路。针对这个场景,我们可以按照需求选择不同的实现方式:
1. 严格等效C++全局变量的实现
如果要和你给出的C++代码完全对齐,使用全局可变变量,可以用Rust的可变静态变量实现:
static mut _i: i32 = 0; fn first_function() { unsafe { _i += 1; } } fn second_function() { unsafe { _i += 1; } } fn main() { first_function(); second_function(); unsafe { println!("Value of _i is {}", _i); } }
注意:该方案需要大量使用
unsafe块,放弃了Rust编译器的内存安全检查,全局可变状态也容易引发并发安全问题,非特殊要求不推荐使用。
2. 更符合Rust规范的无unsafe实现
2.1 轻量场景用闭包实现
如果不需要跨上下文复用这两个函数,直接用闭包捕获局部变量即可,不需要额外定义结构体,代码更简洁:
fn main() { let mut counter = 0; let mut first_function = || counter += 1; let mut second_function = || counter += 1; first_function(); second_function(); println!("Value of counter is {}", counter); }
2.2 复杂场景沿用结构体方案
你原本写的结构体方案可以做几个小优化,更符合Rust编码规范:
struct Counter { value: i32, } impl Counter { fn new() -> Self { Self { value: 0 } } fn first_operation(&mut self) { self.value += 1; } fn second_operation(&mut self) { self.value += 1; } } fn main() { let mut counter = Counter::new(); counter.first_operation(); counter.second_operation(); println!("Value of counter is {}", counter.value); }
优化点包括:
- 结构体和方法命名更语义化,避免无意义的命名
- 补充了构造函数
new,简化实例化逻辑 - 用
+= 1替代加法赋值的冗余写法 - 去掉了不必要的下划线前缀变量名(Rust中下划线前缀用于标记未使用的变量)
内容的提问来源于stack exchange,提问作者Alexandra Danith Ansley
相关产品推荐
相关产品推荐

