Acabo de leer: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Por lo que tengo entendido, Null
es un rasgo y su única instancia lo es null
.
Cuando un método toma un argumento Null, entonces solo podemos pasarle una Null
referencia o null
directamente, pero no cualquier otra referencia, incluso si es nula ( nullString: String = null
por ejemplo).
Me pregunto en qué casos Null
podrí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
Null
tipo está ahí por compatibilidad con la máquina virtual Java , y Java en particular.Debemos considerar que Scala :
null
referencias para acceder, por ejemplo, bibliotecas y código Javapor tanto, se hace necesario definir un tipo para el
null
valor, que es elNull
rasgo, y tienenull
como única instancia.No hay nada especialmente útil en el
Null
tipo a menos que sea el sistema de tipos o esté desarrollando en el compilador. En particular, no veo ninguna razón sensata para definir unNull
parámetro de tipo para un método, ya que no puede pasar nada más quenull
fuente
Unit
se puede utilizar así:Esto le permite pasar un bloque arbitrario de código para su ejecución.
Null
podría usarse como un tipo inferior para cualquier valor que sea anulable. Un ejemplo es este:Nothing
se utiliza en la definición deNone
Esto le permite asignar un
None
a cualquier tipo deOption
porqueNothing
'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
E
en elOption
tiene que estar en posición covariante:trait Option[+E]
para permitir cosas comoval x: Option[Int] = None
En realidad, nunca he usado el
Null
tipo, pero usasUnit
, donde lo harías con javavoid
.Nothing
es un tipo especial, porque como Nathan ya mencionó, no puede haber ninguna instancia deNothing
.Nothing
es 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.None
tambié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) false
else 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
Nothing
partirscala.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
notUsed
mé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