2014-07-19 30 views
17

Pas, birim tipinde, (), tek bir sıfır boyut değerine sahip bir türe sahiptir. Bu birim tipinin değeri de () kullanılarak belirtilmiştir.Rust'taki birim tipinin amacı nedir?

Birim tipinin amacı ve değeri nedir? Diğer dillerdeki gibi null (veya nil) kullanmaktan kaçınmak için bir mekanizma var mı?

+1

Daha çok C benzeri dillerdeki 'void' gibi. Bildiğim kadarıyla, her şey pasda bir ifadedir, bu yüzden '' '' 'sadece etkileri için idam edilen bir şey tarafından döndürülen değerdir. – Lee

+0

Kendi sıfır boyut tiplerinizi yapabilirsin, aynen '()' yapıp yapılandırabilirim 'MyNewZeroSizeType; 'Faydalı olabilir (" marker tipleri "!) – bluss

+1

Bu java'da null gibi görünmüyor çünkü eğer geri döndüğünüzde bunun yerine bir '' '' '' 'döndüremediğini söyleyiniz. – JustGage

cevap

25

(), () türünün değeridir ve amacı işe yaramaz olmaktır.

Rust'taki her şey bir ifadedir ve "hiçbir şey" döndürmeyen ifadeler aslında () değerini döndürür. Geri dönüş türü olmayan bir işleviniz varsa ancak ()'dan başka bir şey döndürürseniz, derleyici bir hata verecektir.

() için pratik kullanımlar da vardır. Bazen jenerik bir tiple ilgilenmiyoruz ve () bunu açık hale getiriyor. Örneğin, bir Result<(), String>Result<(), String>, başarılı bir şekilde tamamlayan veya çeşitli nedenlerden dolayı başarısız olan bir işlev için dönüş türü olarak kullanılabilir.

+0

Ayrıca, bunun için yöntemleri de tanımlayabiliriz, ancak bunlarla ilişkili bir durum olmayacak ... Bu doğru mu? – errordeveloper

+1

@errordeveloper evet, '' 'ile yapabileceğiniz hemen hemen her şey önemsiz bir uygulamaya sahiptir. – huon

7

C gibi bir dilden geliyorsanız (C, C++, Java vb.), Birimi void gibi düşünebilirsiniz. Hiçbir şey iade etmek istemediğinizde döndüğünüz tür. Tipik teorisyenler, birimin void değerine sahip olmadığına, ünitenin tam olarak 1 değerine sahip olduğuna, void'in de 0 değerine sahip olduğuna işaret edecektir.

Pratikte, her iki türde de depolayabileceğiniz bilgi miktarı aynıdır (0 bit), üniteyi kullanan diller daha iyi çalışmak eğiliminde olmalarına rağmen, başka bir değere göre davranabilirsiniz.

Bir değişken, yapı, koleksiyon veya bir değeri depolayabileceğiniz başka bir yerde saklayabilirsiniz. Bir argüman olarak geçebilir veya sonuç olarak iade edebilirsiniz. Bir referans oluşturabilirsiniz.

Peki, bu ne zaman yararlıdır? Temel olarak, ne tür bir değerle uğraştığınız umrumda değilken. Bu, gerçekte herhangi bir bilgi içermekte olup olmadığına dair endişelenmenize gerek kalmadan polimorfik/jenerik kod yazabileceğiniz anlamına gelir. Yani, gerçek verileri depoladığınıza veya ()'a sahip olup olmadığınıza dair özel bir duruma gerek yoktur.

Kullanıldığı yerlerin bir örneği HashSet. Bir HashSet<T>, aslında a thin wrapper around HashMap<T,()> olarak uygulanır. (T - () için jenerik türden bir harita)