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