()在函数中作为参数的含义是什么,期望类型为T的参数?

时间:2016-02-22 05:21:13

标签: rust

我是Rust的新手,当我发现这个时,我正在阅读Dining Philosophers' tutorial

Mutex::new(())

我不知道new里面的论点是什么意思。我读了documentation for Mutex,我仍然不知道它意味着什么。我很感激有关引擎盖下发生的事情的解释。

2 个答案:

答案 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在类型上是通用的,因此它可以接受任何类型。