Je viens de lire: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Autant que je sache, Null
c'est un trait et son seul exemple est null
.
Lorsqu'une méthode prend un argument Null, alors nous ne pouvons lui passer qu'une Null
référence ou null
directement, mais pas toute autre référence, même si elle est nulle ( nullString: String = null
par exemple).
Je me demande simplement dans quels cas l'utilisation de ce Null
trait pourrait être utile. Il y a aussi le trait Nothing pour lequel je ne vois plus vraiment d'exemples.
Je ne comprends pas vraiment non plus quelle est la différence entre l'utilisation de Nothing et Unit comme type de retour, puisque les deux ne retournent aucun résultat, comment savoir laquelle utiliser quand j'ai une méthode qui effectue la journalisation par exemple?
Avez-vous des utilisations de Unit / Null / Nothing comme autre chose qu'un type de retour?
L'article que vous citez peut être trompeur. Le
Null
type est là pour la compatibilité avec la machine virtuelle Java , et Java en particulier.Nous devons considérer que Scala :
null
références pour accéder, par exemple, aux bibliothèques et au code Javail devient donc nécessaire de définir un type pour la
null
valeur, qui est leNull
trait, et qui anull
pour seule instance.Il n'y a rien de particulièrement utile dans le
Null
type à moins que vous ne soyez le système de type ou que vous développiez sur le compilateur. En particulier, je ne vois aucune raison raisonnable de définir unNull
paramètre de type pour une méthode, car vous ne pouvez rien passer d'autre quenull
la source
Unit
peut être utilisé comme ceci:Cela vous permet de passer un bloc de code arbitraire à exécuter.
Null
peut être utilisé comme type inférieur pour toute valeur pouvant être Nullable. Un exemple est celui-ci:Nothing
est utilisé dans la définition deNone
Cela vous permet d'attribuer un
None
à n'importe quel type deOption
carNothing
«étend» tout.la source
si vous utilisez
Nothing
, il n'y a rien à faire (inclure la console d'impression) si vous faites quelque chose, utilisez le type de sortieUnit
... alors comment l'utiliser
Nothing
?la source
E
dans leOption
doit être en position covariante:trait Option[+E]
pour autoriser des choses commeval x: Option[Int] = None
Je n'ai jamais réellement utilisé le
Null
type, mais vous utilisezUnit
, là où vous utiliseriez javavoid
.Nothing
est un type spécial, car comme Nathan l'a déjà mentionné, il ne peut y avoir aucune instance deNothing
.Nothing
est ce qu'on appelle un type inférieur, ce qui signifie qu'il s'agit d'un sous-type de tout autre type. Ceci (et le paramètre de type contravariant) est la raison pour laquelle vous pouvez ajouter n'importe quelle valeur àNil
- qui est unList[Nothing]
- et la liste sera alors de ce type d'éléments.None
également si de typeOption[Nothing]
. Chaque tentative d'accès aux valeurs à l'intérieur d'un tel conteneur lèvera une exception, car c'est le seul moyen valide de retourner à partir d'une méthode de typeNothing
.la source
IO[Unit]
pour l'impression sur la console et similaire.Rien n'est souvent utilisé implicitement. Dans le code ci-dessous,
val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
la clause else est de type Nothing , qui est une sous-classe de Boolean (ainsi que tout autre AnyVal). Ainsi, toute l'affectation est valide pour le compilateur, bien que la clause else ne renvoie vraiment rien.la source
Voici un exemple de
Nothing
descala.predef
:Si vous n'êtes pas familier (et que les moteurs de recherche ne peuvent pas effectuer de recherche),
???
la fonction d'espace réservé de Scala pour tout ce qui n'a pas encore été implémenté. Tout comme KotlinTODO
.Vous pouvez utiliser la même astuce lors de la création d'objets fictifs: remplacez les méthodes inutilisées par une
notUsed
méthode personnalisée . L'avantage de ne pas utiliser???
est que vous n'obtiendrez pas d'avertissements de compilation pour des choses que vous n'avez jamais l'intention d'implémenter.la source
En termes de théorie des catégories Rien n'est un objet initial et Unit est un objet terminal .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Les objets initiaux sont également appelés coterminaux ou universels , et les objets terminaux sont également appelés finaux .
Si un objet est à la fois initial et terminal , il est appelé objet zéro ou objet nul .
la source