Сравнивая переменную Julia с `none`, используя! == или! = - PullRequest
0 голосов
/ 02 июля 2019

В некотором коде Julia, когда можно увидеть условное выражение, такое как

if val !== nothing
    dosomething()
end

где val - переменная типа Union{Int,Nothing}

В чем разница между условиями val !== nothing и val != nothing?

1 Ответ

5 голосов
/ 02 июля 2019

Прежде всего, обычно рекомендуется использовать isnothing для сравнения, если что-то nothing. Эта конкретная функция эффективна, поскольку она основана только на типах (@edit isnothing(nothing)):

isnothing(::Any) = false
isnothing(::Nothing) = true

(Обратите внимание, что nothing является единственным экземпляром типа Nothing.)

Что касается вашего вопроса, разница между === и == (и в равной степени !== и !=) заключается в том, что первое проверяет, являются ли две вещи идентичными , тогда как второе проверяет для равенство . Чтобы проиллюстрировать это различие, рассмотрим следующий пример:

julia> 1 == 1.0 # equal
true

julia> 1 === 1.0 # but not identical
false

Обратите внимание, что первый является целым числом, а второй - числом с плавающей запятой.

Что означает, что две вещи идентичны? Можем ознакомиться с документацией операторов сравнения (?===):

help?> ===
search: === == !==

  ===(x,y) -> Bool
  ≡(x,y) -> Bool

  Determine whether x and y are identical, in the sense that no program could distinguish them. First the types
  of x and y are compared. If those are identical, mutable objects are compared by address in memory and
  immutable objects (such as numbers) are compared by contents at the bit level. This function is sometimes
  called "egal". It always returns a Bool value.

Иногда сравнение с === выполняется быстрее, чем с ==, поскольку последнее может включать преобразование типов.

...