私は錆に新しいですし、私はこれを見つけたとき、私はDining Philosophers' tutorialを読んでいた:私は知りませんタイプTのパラメータが期待される関数では、()は何を引数として意味しますか?
Mutex::new(())
何new
手段内の引数。私はdocumentation for Mutex
を読んでいて、私はまだそれが何を意味するか分からない。私はボンネットの下で起こっていることについての説明に感謝します。
私は錆に新しいですし、私はこれを見つけたとき、私はDining Philosophers' tutorialを読んでいた:私は知りませんタイプTのパラメータが期待される関数では、()は何を引数として意味しますか?
Mutex::new(())
何new
手段内の引数。私はdocumentation for Mutex
を読んでいて、私はまだそれが何を意味するか分からない。私はボンネットの下で起こっていることについての説明に感謝します。
()
は単なる値のないタプルです。 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
は通常、アクセスしたいオブジェクトをラップしてオブジェクトにします。そのオブジェクトをミューテックスに入れてから、ミューテックスをロックするときに得られるガードからアクセスすることができます。ただし、この例では実際のデータは保護されていないので、()
が使用されています.はそのタイプに汎用であるため、すべてのタイプを受け入れることができます。
()
は、unit typeとも呼ばれる空のtupleです。メンバータイプのないタプルです。前記タイプの唯一の有効な値でもある。それはa size of zeroを持っています(それはまだSized
であり、ちょうど0のサイズです)、実行時には存在しません。これにはいくつかの有用な効果があり、そのうちの1つがここで使用されています。
ここでは、()
を使用して、所有データなしでMutex
を作成します。これは、ロック解除可能でロック可能なミューテックスです。私たちは、明示的にturbofish operator::<>
で型推論を書き出す場合は、我々はまた、書くことができます:初期値()
と()
が含まれている、我々はnew
Mutex
を作成しているされて
Mutex::<()>::new(())
を。
私はいつもその構文が...クールリンクと呼ばれていたのかと疑問に思いました。 – squiguy
それは錆に関する私の好きなものの一つです...私はそれがより検索可能になるようにどこでもそれを振りかけるつもりです。 – thirtythreeforty
このようなゼロサイズのタイプが「サイズ指定」されているかどうかに注意することも役立ちます。 (彼らはそうしていますか?) – LinearZoetrope
"void"という概念を追加することがありますか?ほとんどのプログラマーは「無効」を知っているので、助けになるでしょう。 –
@LukasKalbertodt:しかし、それは不規則です。 C++のテンプレートプログラミングでは、例えば 'void'は悪夢です。一方、 '()'は型システムに完全に統合されています=>それは他のものと同様のタプルです。 –
@MatthieuM。そうですが、**私はまだ他の言語のプログラマーが 'void 'と比較するのに役立つと思っています... –