我是Rust 的新手,当我发现这个时,我正在阅读Dining Philosophers的教程:
Mutex::new(())
Run Code Online (Sandbox Code Playgroud)
我不知道里面的论点new意味着什么.我阅读了文档Mutex,但我仍然不知道这意味着什么.我很感激有关引擎盖下发生的事情的解释.
()是空元组,也称为单元类型 - 没有成员类型的元组.它也是所述类型的唯一有效值.它的大小为零(注意它仍然Sized是,大小为0),使其在运行时不存在.这有几个有用的效果,其中一个在这里使用.
这里,()用于创建一个Mutex没有拥有数据 - 它只是一个可解锁和可锁定的互斥锁.如果我们用turbofish运算符 明确地写出类型推断::<>,我们也可以写:
Mutex::<()>::new( () )
Run Code Online (Sandbox Code Playgroud)
也就是说,我们正在创建一个new Mutex包含()初始值的a ().
()只是一个没有价值的元组; 一个0元组.两者的类型和值拼写相同().该类型有时被称为"单元类型"; 它实际上在编译器中实际上是一个不同的类型,但现在只是被视为退化元组.它是0大小的类型; 这种类型的对象实际上不会占用任何空间,尽管它是一种Sized类型,只是大小为0.
它用于需要具有值或类型的情况,但您没有任何相关内容.例如,如果您有一个不返回值的函数,并在需要值的位置调用它,您会发现它实际上返回了()type 的值().
fn nothing() {}
fn main() {
println!("{:?}", nothing());
}
Run Code Online (Sandbox Code Playgroud)
打印()(围栏).
另一种用法是当你有一个类似的泛型类型Result<T, E>,它表示某些操作成功或失败,并且可以保存成功操作的结果,或者指示失败原因的错误.某些操作(例如,std::io::write如果成功但没有值返回但希望能够指示错误)将返回a ,这实际上是一个同义词; 允许函数在成功情况下返回,但在失败时返回一些有意义的错误.std::io::Result<()>Result<(), std::io::Error>Ok(())
您可以将它与voidC或C++ 进行比较,它们也用于缺少返回值.但是,您不能编写具有类型的对象void,这void在泛型编程中的作用要小得多; 你永远不会有一个等价的Result<void, Error>类型,因为你无法构造Ok案例.
在这种情况下,Mutex您要访问的正常包装和对象; 因此,您可以将该对象放入互斥锁,然后从锁定互斥锁时获得的防护中访问它.但是,在这个例子中没有实际的数据被保护,所以()使用,因为你需要在那里放一些东西,并且Mutex在类型上是通用的,所以它可以接受任何类型.