Acabo de leer: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Por lo que tengo entendido, Nulles un rasgo y su única instancia lo es null.
Cuando un método toma un argumento Null, entonces solo podemos pasarle una Nullreferencia o nulldirectamente, pero no cualquier otra referencia, incluso si es nula ( nullString: String = nullpor ejemplo).
Me pregunto en qué casos Nullpodría resultar útil utilizar este rasgo. También está el rasgo Nada para el que realmente no veo más ejemplos.
Realmente tampoco entiendo cuál es la diferencia entre usar Nothing y Unit como tipo de retorno, ya que ambos no devuelven ningún resultado, ¿cómo saber cuál usar cuando tengo un método que realiza el registro, por ejemplo?
¿Tiene usos de Unit / Null / Nothing como algo más que un tipo de retorno?

El artículo que cita puede ser engañoso. El
Nulltipo está ahí por compatibilidad con la máquina virtual Java , y Java en particular.Debemos considerar que Scala :
nullreferencias para acceder, por ejemplo, bibliotecas y código Javapor tanto, se hace necesario definir un tipo para el
nullvalor, que es elNullrasgo, y tienenullcomo única instancia.No hay nada especialmente útil en el
Nulltipo a menos que sea el sistema de tipos o esté desarrollando en el compilador. En particular, no veo ninguna razón sensata para definir unNullparámetro de tipo para un método, ya que no puede pasar nada más quenullfuente
Unitse puede utilizar así:Esto le permite pasar un bloque arbitrario de código para su ejecución.
Nullpodría usarse como un tipo inferior para cualquier valor que sea anulable. Un ejemplo es este:Nothingse utiliza en la definición deNoneEsto le permite asignar un
Nonea cualquier tipo deOptionporqueNothing'extiende' todo.fuente
si lo usa
Nothing, no hay cosas que hacer (incluya la consola de impresión) si hace algo, use el tipo de salidaUnit... entonces, ¿cómo usarlo
Nothing?fuente
Een elOptiontiene que estar en posición covariante:trait Option[+E]para permitir cosas comoval x: Option[Int] = NoneEn realidad, nunca he usado el
Nulltipo, pero usasUnit, donde lo harías con javavoid.Nothinges un tipo especial, porque como Nathan ya mencionó, no puede haber ninguna instancia deNothing.Nothinges un tipo de fondo, lo que significa que es un subtipo de cualquier otro tipo. Esto (y el parámetro de tipo contravariante) es la razón por la que puede anteponer cualquier valor aNil, que es aList[Nothing], y la lista será de este tipo de elementos.Nonetambién si de tipoOption[Nothing]. Cada intento de acceder a los valores dentro de dicho contenedor generará una excepción, porque es la única forma válida de regresar de un método de tipoNothing.fuente
IO[Unit]para imprimir en la consola y similares.A menudo, nada se usa implícitamente. En el código siguiente,
val b: Boolean =if (1 > 2) falseelse throw new RuntimeException("error")la cláusula else es de tipo Nothing , que es una subclase de Boolean (así como cualquier otro AnyVal). Por lo tanto, toda la asignación es válida para el compilador, aunque la cláusula else realmente no devuelve nada.fuente
Aquí está un ejemplo de
Nothingpartirscala.predef:En caso de que no esté familiarizado (y los motores de búsqueda no puedan buscar en él),
???Scala tiene la función de marcador de posición para cualquier cosa que aún no se haya implementado. Como el de KotlinTODO.Puede usar el mismo truco al crear objetos simulados: anule los métodos no utilizados con un
notUsedmétodo personalizado . La ventaja de no usar???es que no recibirá advertencias de compilación para cosas que nunca pretendió implementar.fuente
En términos de teoría de categorías, Nothing es un objeto inicial y Unit es un objeto terminal .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Los objetos iniciales también se denominan coterminales o universales , y los objetos terminales también se denominan finales .
Si un objeto es tanto inicial como terminal , se denomina objeto cero u objeto nulo .
fuente