()
to po prostu krotka bez wartości; 0-krotna. Typ i wartość są pisane tak samo, zarówno ()
. Typ jest czasem nazywany "typem jednostki"; W rzeczywistości był to typ odrębny w kompilatorze, ale teraz jest traktowany jako zdegenerowana krotka. Jest to typ o rozmiarze 0; obiekty tego typu nigdy nie zajmują żadnej przestrzeni, ale jest to typ Sized
, tylko o rozmiarze 0.
Jest używany w przypadkach, gdy musisz mieć wartość lub typ, ale nie mają nic istotnego do umieszczenia tam. Na przykład, jeśli masz funkcję, która nie zwraca wartości i wywołujesz ją w miejscu, które oczekuje wartości, okazuje się, że rzeczywiście zwraca wartość ()
typu ()
.
fn nothing() {}
fn main() {
println!("{:?}", nothing());
}
która drukuje ()
(playpen).
Innym zastosowaniem jest typ ogólny, taki jak Result<T, E>
, który wskazuje na sukces lub niepowodzenie niektórych operacji i może zawierać wynik pomyślnej operacji lub błąd wskazujący powód niepowodzenia. Niektóre operacje, takie jak std::io::write
, które nie mają wartości do zwrócenia w przypadku powodzenia, ale chcą wskazać błąd, zwrócą wartość std::io::Result
<()>
, która jest w rzeczywistości synonimem dla Result
<(), std::io::Error>
; która pozwala funkcji zwracać Ok(())
w przypadku sukcesu, ale jakiś znaczący błąd, gdy się nie powiedzie.
Możesz porównać to do void
w C lub C++, które są również używane do braku wartości zwracanej. Jednak nigdy nie można napisać obiektu o typie void
, który powoduje, że void
jest znacznie mniej użyteczny w programowaniu ogólnym; nigdy nie można mieć odpowiednika typu: Result<void, Error>
, ponieważ nigdy nie można było skonstruować przypadku Ok
.
W tym przypadku Mutex
normalnie opakowuje i obiekt, do którego chcesz uzyskać dostęp; więc możesz umieścić ten obiekt w muteksie, a następnie uzyskać do niego dostęp od strażnika, który otrzymasz po zablokowaniu muteksa.Jednak w tym przykładzie nie ma rzeczywistych danych, które są strzeżone, więc ()
jest używany, ponieważ trzeba coś tam umieścić, a Mutex
jest ogólny nad typem, aby mógł akceptować dowolny typ.
Może dodać pojęcie "pustki"? Większość programistów zna "pustkę", więc to pomogłoby, prawda? –
@LukasKalbertodt: Koszt "unieważnienia" jest jednak nieregularny. W programowaniu C++ szablon, na przykład "void", jest koszmarem. Z drugiej strony '()' jest doskonale zintegrowany z systemem typu => to tylko krotka jak każda inna. –
@ MatthieuM. Racja, ale ** ja ** nadal uważam, że pomogłoby to programistom pochodzącym z innych języków porównać go z 'void' ... –