在以下内容中:
julia>e=如果为false;终止juliajulia>f=匹配(r"x","y")julia>fjulia>a=[]0元素数组{Any,1}julia虚假的julia>e==ftrue
。。。这里的e和f是什么类型的?
来自文档:在s
中搜索正则表达式r
的第一个匹配项,并返回包含该匹配项的RegexMatch
对象,如果匹配失败,则不返回任何对象(可能会从零更改为nothing
-感谢您指出这一点!:)BTWnothing
是Void类型的单例。您可以检查match(r"x", "y") == nothing
或match(r"x", "y") === nothing
编辑:文档中的更多解释:"如果正则表达式与给定字符串不匹配,match()
将返回nothing
,这是一个特殊值,不会在交互提示下打印任何内容。除了不打印之外,它是一个完全正常的值,您可以通过编程对其进行测试:…(这里的示例带有===运算符)…">
(我现在不认为这是理想的!此时此刻公关的空间可能就在这里:)
来自手册:
如果块也返回一个值。。。此值只是返回值选择的分支中最后执行的语句的值
在您的情况下,没有执行的语句,因为if
条件的计算结果为false
。在这种情况下,julia返回特殊类型Void
,它也绑定到字nothing
,即
julia> typeof(nothing)
Void
然而,即使您的if
条件评估为true
,它仍然不包含要执行的语句,因此julia将再次返回nothing
,即
julia> typeof(if true ; end)
Void
要从if
块中获得Void
以外的返回类型,您需要执行一条语句,例如
julia> typeof(if true ; 3 ; end)
Int64
现在,在您提供的代码中,您将if false ; end
的输出分配给e
(顺便提一下,在julia v1.0之前,这是一个坏主意,因为e
已经在julia中用于特殊常数Euler数,即
julia> typeof(e)
Irrational{:e}
julia> e
e = 2.7182818284590...
这就是为什么你会从你的第一行代码中收到警告信息:
julia> e = if false; end
WARNING: imported binding for e overwritten in module Main
但是julia仍然按照您的要求执行,并将if false; end
的输出分配给e
,因此现在:
julia> typeof(e)
Void
现在,nothing
与空向量不是一回事。空向量仍然是一种特殊的类型,即使它没有元素:
julia> typeof([])
Array{Any,1}
因此它立即如下:
julia> if false ; end == []
false
这就是为什么您的e == a
返回false
。现在让我们来看看match
的文档。在REPL键入?match
,第一行状态为:
搜索s中正则表达式r的第一个匹配项并返回包含匹配项的RegexMatch对象,如果匹配项则不包含失败
因此,如果正则表达式找不到匹配项,则返回类型为Void
(因此返回值为nothing
)。显然,在您的情况下,match(r"x", "y")
找不到匹配项,因此它返回Void
并将其分配给f
。由于e
和f
现在都是nothing
(即Void
类型),因此e == f
立即返回true
,或者换句话说:
julia> if false ; end == match(r"x", "y")
true