Właśnie przeczytałem: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
O ile rozumiem, Null
jest to cecha i jej jedynym przykładem jest null
.
Kiedy metoda przyjmuje argument o wartości Null, wówczas możemy przekazać jej tylko Null
referencję lub null
bezpośrednio, ale nie inne odwołanie, nawet jeśli ma wartość null ( nullString: String = null
na przykład).
Zastanawiam się tylko, w jakich przypadkach użycie tej Null
cechy może być przydatne. Jest też cecha Nic, dla której nie widzę więcej przykładów.
Nie bardzo rozumiem też, jaka jest różnica między używaniem Nothing i Unit jako typu zwracanego, ponieważ oba nie zwracają żadnego wyniku, jak sprawdzić, którego użyć, gdy mam na przykład metodę, która wykonuje rejestrowanie?
Czy używasz Unit / Null / Nothing jako czegoś innego niż typ zwracany?
Cytowany artykuł może wprowadzać w błąd.
Null
Typ jest tam za zgodność z maszyną wirtualną Java i Java w szczególności.Musimy wziąć pod uwagę, że Scala :
null
odwołania, aby uzyskać dostęp, na przykład, do bibliotek i kodu Javaw związku z tym konieczne staje się zdefiniowanie typu
null
wartości, która jestNull
cechą i manull
jako jedyny egzemplarz.W
Null
typie nie ma nic szczególnie przydatnego, chyba że jesteś systemem typów lub programujesz na kompilatorze. W szczególności nie widzę żadnego sensownego powodu do definiowaniaNull
parametru typu dla metody, ponieważ nie można przekazać niczego innegonull
źródło
Unit
można używać w ten sposób:Pozwala to na przekazanie dowolnego bloku kodu do wykonania.
Null
może być używany jako typ dolny dla dowolnej wartości, której wartość dopuszcza wartość null. Oto przykład:Nothing
jest używany w definicjiNone
Pozwala to przypisać a
None
do dowolnego typu,Option
ponieważNothing
„rozszerza” wszystko.źródło
jeśli używasz
Nothing
, nie ma nic do zrobienia (w tym konsoli drukowania), jeśli coś robisz, użyj typu wyjściaUnit
... więc jak używać
Nothing
?źródło
E
tymOption
musi być w kowariantnej pozycji:trait Option[+E]
aby pozwolić na rzeczy takie jakval x: Option[Int] = None
Właściwie nigdy nie użyłem tego
Null
typu, ale używasz tegoUnit
, czego używałbyś w Javievoid
.Nothing
jest szczególnym typem, ponieważ jak już wspomniał Nathan, nie może być instancjiNothing
.Nothing
jest tzw. typem dolnym, co oznacza, że jest podtypem dowolnego innego typu. To (i parametr typu kontrawariantnego) jest powodem, dla którego możesz poprzedzić dowolną wartośćNil
- która jestList[Nothing]
- a lista będzie wtedy tego typu elementów.None
także jeśli jest typuOption[Nothing]
. Każda próba uzyskania dostępu do wartości wewnątrz takiego kontenera spowoduje zgłoszenie wyjątku, ponieważ jest to jedyny prawidłowy sposób powrotu z metody typuNothing
.źródło
IO[Unit]
do drukowania na konsoli i tym podobnych.Nic nie jest często używane w sposób dorozumiany. W poniższym kodzie inny klauzula jest typu Nothing , który jest podklasą Boolean (jak również wszelkie inne AnyVal). Zatem całe przypisanie jest poprawne dla kompilatora, chociaż klauzula else tak naprawdę nic nie zwraca.
val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
źródło
Oto przykład
Nothing
zscala.predef
:W przypadku, gdy nie jesteś zaznajomiony (a wyszukiwarki nie mogą w tym wyszukiwać)
???
, funkcja zastępcza Scala dla wszystkiego, co nie zostało jeszcze zaimplementowane. Tak jak KotlinTODO
.Możesz użyć tej samej sztuczki podczas tworzenia pozorowanych obiektów: nadpisać nieużywane metody
notUsed
metodą niestandardową . Zaletą nieużywania???
jest to, że nie otrzymasz ostrzeżeń o kompilacji dla rzeczy, których nigdy nie zamierzasz zaimplementować.źródło
W kategoriach teorii kategorii Nic nie jest przedmiotem początkowym, a Jednostka jest obiektem końcowym .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Obiekty początkowe są również nazywane koterminalami lub uniwersalnymi , a obiekty końcowe nazywane są również ostatecznymi .
Jeśli obiekt jest zarówno początkowy, jak i końcowy , nazywany jest obiektem zerowym lub zerowym .
źródło