Acabei de ler: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Pelo que entendi, Null
é uma característica e sua única instância é null
.
Quando um método recebe um argumento Nulo, só podemos passar uma Null
referência ou null
diretamente, mas nenhuma outra referência, mesmo que seja nula ( nullString: String = null
por exemplo).
Eu só me pergunto em quais casos usar essa Null
característica pode ser útil. Há também o traço Nothing para o qual eu realmente não vejo mais exemplos.
Também não entendo bem qual é a diferença entre usar Nothing e Unit como tipo de retorno, já que ambos não retornam nenhum resultado, como saber qual usar quando tenho um método que executa o log por exemplo?
Você usa Unit / Null / Nothing como algo mais do que um tipo de retorno?
O artigo que você cita pode ser enganoso. O
Null
tipo existe para compatibilidade com a máquina virtual Java Java e Java em particular.Devemos considerar que Scala :
null
referências para acessar, por exemplo, bibliotecas Java e códigoassim, torna-se necessário definir um tipo para o
null
valor, que é oNull
traço, e temnull
como única instância.Não há nada especialmente útil no
Null
tipo, a menos que você seja o sistema de tipos ou esteja desenvolvendo no compilador. Em particular, não vejo nenhuma razão sensata para definir umNull
parâmetro de tipo para um método, uma vez que você não pode passar nada alémnull
fonte
Unit
pode ser usado assim:Isso permite que você passe um bloco arbitrário de código a ser executado.
Null
pode ser usado como um tipo inferior para qualquer valor anulável. Um exemplo é este:Nothing
é usado na definição deNone
Isso permite que você atribua um
None
a qualquer tipo deOption
porqueNothing
'estende' tudo.fonte
se você usar
Nothing
, não há nada a fazer (incluir console de impressão) se você fizer algo, use o tipo de saídaUnit
... então como usar
Nothing
?fonte
E
oOption
tem que estar na posição covariante:trait Option[+E]
para permitir coisas comoval x: Option[Int] = None
Na verdade, nunca usei o
Null
tipo, mas você usaUnit
, onde usaria em javavoid
.Nothing
é um tipo especial porque, como Nathan já mencionou, não pode haver nenhuma instância deNothing
.Nothing
é o chamado tipo de fundo, o que significa que é um subtipo de qualquer outro tipo. Este (e o parâmetro de tipo contravariante) é o motivo pelo qual você pode acrescentar qualquer valor aNil
- que é umList[Nothing]
- e a lista será desse tipo de elemento.None
também se do tipoOption[Nothing]
. Cada tentativa de acessar os valores dentro de tal contêiner lançará uma exceção, porque é a única maneira válida de retornar de um método do tipoNothing
.fonte
IO[Unit]
para impressão no console e semelhantes.Muitas vezes, nada é usado implicitamente. No código a seguir,
val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
a cláusula else é do tipo Nothing , que é uma subclasse de Boolean (assim como qualquer outro AnyVal). Assim, toda a atribuição é válida para o compilador, embora a cláusula else realmente não retorne nada.fonte
Aqui está um exemplo de
Nothing
partirscala.predef
:No caso de você não estar familiarizado (e os motores de busca não podem pesquisar nele),
???
é a função de espaço reservado do Scala para qualquer coisa que ainda não tenha sido implementada. Assim como o de KotlinTODO
.Você pode usar o mesmo truque ao criar objetos fictícios: substitua métodos não usados por um
notUsed
método personalizado . A vantagem de não usar???
é que você não receberá avisos de compilação para coisas que nunca pretende implementar.fonte
Em termos de teoria das categorias, Nada é um objeto inicial e Unidade é um objeto terminal .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Os objetos iniciais também são chamados de coterminais ou universais e os objetos terminais também são chamados de finais .
Se um objeto é inicial e terminal , ele é chamado de objeto zero ou objeto nulo .
fonte