有没有办法以有意义的方式声明变量不可变?

时间:2015-06-15 07:26:53

标签: rust immutability

到目前为止,我认为声明一个没有mut的变量,确保在初始化后无法更改。

我认为这很棒,因为我总是对C和C ++中const不保证任何内容的方式感到不满。

我刚刚发现我错了:Rust允许内部可变性(参见std::cell)。它给你一些保证,但是当我听到不可变的时候,它不是我所期望和希望的。

有没有办法宣布“真正不可变”的东西?

1 个答案:

答案 0 :(得分:3)

在运行时评估的代码中不可能防止内部可变性(常量评估使这很容易,没有任何类型的突变)。您无法控制的任何类型都可能使用不安全的代码来实现内部可变性。为了防止最常见的情况,您可以使用所谓的“标记特征”。这个特性没有其他目的,只是为了区分实现特征的类型和不特征的类型。

#![feature(optin_builtin_traits)]

use std::cell::{RefCell, Cell, UnsafeCell};
use std::sync::Mutex;

unsafe trait ReallyImmutable {}

unsafe impl ReallyImmutable for .. {}
impl<T> !ReallyImmutable for RefCell<T> {}
impl<T> !ReallyImmutable for Cell<T> {}
impl<T> !ReallyImmutable for UnsafeCell<T> {}
impl<T> !ReallyImmutable for Mutex<T> {}
impl<'a, T> !ReallyImmutable for &'a mut T {}
impl<T> !ReallyImmutable for *mut T {}
impl<T> !ReallyImmutable for *const T {}

这当然有一个缺点,就是要求你将内部可变性列入黑名单而不是列入不可变类型的白名单。所以你可能总会错过一些东西。