Em quantas línguas Nulo não é igual a nada, nem mesmo Nulo?
-
09-06-2019 - |
Pergunta
Em quantas línguas Nulo não é igual a nada, nem mesmo Nulo?
Solução
É assim no SQL (como uma linguagem lógica) porque nulo significa desconhecido/indefinido.
No entanto, em linguagens de programação (como C++ ou C#), um ponteiro/referência nulo é um valor específico com um significado específico - nada.
Dois nadas são equivalentes, mas duas incógnitas não.A confusão vem do fato de o mesmo nome (nulo) ser usado para ambos os conceitos.
Outras dicas
Em VB6 a expressão Null = Null
vai produzir Null
em vez de True
como seria de esperar.Isso causará um erro de tempo de execução se você tentar atribuí -lo a um booleano, no entanto, se você o usar como a condição de "If ... Then
"vai agir como False
.Além disso Null <> Null
vai tambémproduzir Null
, então:
Em VB6 você poderia dizer isso Null
não é igual a si mesmo (ou a qualquer outra coisa), nem desigual!
Você deveria testá-lo usando o IsNull()
função.
VB6 também possui outros valores especiais:
Nothing
para referências de objetos.Nothing = Nothing
é um erro de compilação.(você deveria compará-lo usando "is
")Missing
para parâmetros opcionais que não foram fornecidos.Não tem representação literal, então você nem consegue escreverMissing = Missing
.(o teste éIsMissing(foo)
)Empty
para variáveis não inicializadas.Este testa igual a si mesmo, embora haja também uma funçãoIsEmpty()
.- ...deixe-me saber se eu esqueci algum
Lembro-me de ficar um pouco enojado com VB.
Oracle é assim.
SELECT * FROM dual WHERE NULL=null; --no rows returned
O MySQL tem um operador de igualdade seguro para nulos, <=>, que retorna verdadeiro se ambos os lados forem iguais ou ambos os lados forem nulos.Ver Documentos MySQL.
Em C#, Nullable<bool> possui propriedades interessantes em relação aos operadores lógicos, mas o operador de igualdade é o mesmo que outros tipos nessa linguagem (ou seja, ((bool?)null == (bool?)null) == true) .
Para preservar o em curto-circuito comportamento dos operadores lógicos em curto-circuito e para preservar a consistência com os operadores lógicos sem curto-circuito, o booleano anulável tem algumas propriedades interessantes.Por exemplo:verdadeiro || null == true.falso && nulo == falso, etc.Isso está em contradição direta com outras linguagens lógicas de três valores, como SQL ANSI.
Você pode fazer o Ruby funcionar dessa maneira:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null
No SQL você teria que fazer algo como:
WHERE column is NULL
em vez de
WHERE column = NULL