使用 !== 或 != 将 Julia 变量与 `nothing` 进行比较
Comparing Julia variable to `nothing` using !== or !=
在一些Julia代码中什么时候可以看到条件表达式比如
if val !== nothing
dosomething()
end
其中 val
是 Union{Int,Nothing}
类型的变量
条件 val !== nothing
和 val != nothing
有什么区别?
首先,一般建议使用isnothing
来比较是否是nothing
。这个特定的函数是有效的,因为它是基于类型的(@edit isnothing(nothing)
):
isnothing(::Any) = false
isnothing(::Nothing) = true
(请注意 nothing
是类型 Nothing
的唯一实例。)
关于您的问题,===
和 ==
(以及 !==
和 !=
)之间的区别在于前者检查两个事物是否是 identical 而后者检查 equality。为了说明这种差异,请考虑以下示例:
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.
有时,与 ===
比较比与 ==
比较更快,因为后者可能涉及类型转换。
在一些Julia代码中什么时候可以看到条件表达式比如
if val !== nothing
dosomething()
end
其中 val
是 Union{Int,Nothing}
条件 val !== nothing
和 val != nothing
有什么区别?
首先,一般建议使用isnothing
来比较是否是nothing
。这个特定的函数是有效的,因为它是基于类型的(@edit isnothing(nothing)
):
isnothing(::Any) = false
isnothing(::Nothing) = true
(请注意 nothing
是类型 Nothing
的唯一实例。)
关于您的问题,===
和 ==
(以及 !==
和 !=
)之间的区别在于前者检查两个事物是否是 identical 而后者检查 equality。为了说明这种差异,请考虑以下示例:
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.
有时,与 ===
比较比与 ==
比较更快,因为后者可能涉及类型转换。