2016-02-22 13 views
6

私は錆に新しいですし、私はこれを見つけたとき、私はDining Philosophers' tutorialを読んでいた:私は知りませんタイプTのパラメータが期待される関数では、()は何を引数として意味しますか?

Mutex::new(()) 

new手段内の引数。私はdocumentation for Mutexを読んでいて、私はまだそれが何を意味するか分からない。私はボンネットの下で起こっていることについての説明に感謝します。

答えて

6

()は単なる値のないタプルです。 0タプル。型と値の綴りは同じです(())。タイプは「ユニットタイプ」と呼ばれることもあります。これは実際にはコンパイラでは別の型になっていましたが、現在は縮退したタプルとして扱われています。これは0サイズの型です。このタイプのオブジェクトは実際にはスペースを占めることはありませんが、サイズが0のSizedタイプです。

値またはタイプが必要な場合に使用されますが、そこに置くことは何も関係がありません。たとえば、値を返さない関数があり、その値を必要とする場所で呼び出すと、()という値(実際には())が返されることがわかります。

fn nothing() {} 

fn main() { 
    println!("{:?}", nothing()); 
} 

これは()playpen)を印刷します。

Result<T, E>のようなジェネリックタイプがある場合は、操作の成功または失敗を示し、正常な操作の結果または失敗した理由を示すエラーを保持できます。成功した場合に戻り値を持たないが、エラーを示すことができるような値のstd::io::writeなどの操作は、std::io::Result<()>を返します。実際はResult<(), std::io::Error>の同義語です。関数が成功の場合はOk(())を返しますが、失敗した場合は意味のあるエラーが返されます。

CまたはC++でvoidと比較すると、戻り値が不足していることがあります。しかし、タイプvoidのオブジェクトを書くことはできません。voidはジェネリックプログラミングではあまり役に立ちません。 Okケースを構築することができなかったので、等価のResult<void, Error>タイプを使用することはできません。

この場合、Mutexは通常、アクセスしたいオブジェクトをラップしてオブジェクトにします。そのオブジェクトをミューテックスに入れてから、ミューテックスをロックするときに得られるガードからアクセスすることができます。ただし、この例では実際のデータは保護されていないので、()が使用されています.はそのタイプに汎用であるため、すべてのタイプを受け入れることができます。

+0

"void"という概念を追加することがありますか?ほとんどのプログラマーは「無効」を知っているので、助けになるでしょう。 –

+1

@LukasKalbertodt:しかし、それは不規則です。 C++のテンプレートプログラミングでは、例えば 'void'は悪夢です。一方、 '()'は型システムに完全に統合されています=>それは他のものと同様のタプルです。 –

+0

@MatthieuM。そうですが、**私はまだ他の言語のプログラマーが 'void 'と比較するのに役立つと思っています... –

8

()は、unit typeとも呼ばれる空のtupleです。メンバータイプのないタプルです。前記タイプの唯一の有効な値でもある。それはa size of zeroを持っています(それはまだSizedであり、ちょうど0のサイズです)、実行時には存在しません。これにはいくつかの有用な効果があり、そのうちの1つがここで使用されています。

ここでは、()を使用して、所有データなしでMutexを作成します。これは、ロック解除可能でロック可能なミューテックスです。私たちは、明示的にturbofish operator::<>で型推論を書き出す場合は、我々はまた、書くことができます:初期値()()が含まれている、我々はnewMutexを作成しているされて

Mutex::<()>::new(()) 

を。

+0

私はいつもその構文が...クールリンクと呼ばれていたのかと疑問に思いました。 – squiguy

+0

それは錆に関する私の好きなものの一つです...私はそれがより検索可能になるようにどこでもそれを振りかけるつもりです。 – thirtythreeforty

+0

このようなゼロサイズのタイプが「サイズ指定」されているかどうかに注意することも役立ちます。 (彼らはそうしていますか?) – LinearZoetrope

関連する問題