[我正在尝试使用Julia(1.2)REPL中的某些功能,但是我对分派我不了解的事情保持了头脑。
我首先尝试了这件事,它的工作方式符合我的预期:
f(a::T) where {T <: Int} = "Test"
从Int <: Int == true
]开始调用f(3)>
调用f(“ Hello”)会导致“ MethodError:没有方法匹配”错误,因为String <: Int == false
然后,我尝试了此功能,但我不明白为什么在某些情况下调用它会起作用:
f(a::T, b::U) where {T, U <: T} = "Another Test"
呼叫f(3,3)正常工作(正如我预期的那样
]但是f(3,“ Hello”)也可以,并且不会抛出“ MethodError:没有方法匹配”。
我以为(因为T成为Int而U成为String)String <: Int == false
???
我想我这里缺少一些非常简单的东西,但是我找不到它...所以这是我的问题,为什么f(3,“ Hello”)在起作用???
此外,我尝试了此代码段(我试图重新创建第二个功能签名),并且按预期正确地失败了:
Test = Tuple{T, U} where {T, U <: T}
Test{Int, String}
(这失败,因为我预期会出现“ TypeError:Type,in U,预期U <:int64 got type>
我正在尝试使用Julia(1.2)REPL中的某些功能,但我对某些我不了解的有关调度的问题深信不疑。我首先尝试了按我期望的方式工作的东西:f(a :: T)...
这里发生的是T
可以是数据类型,U
可以是任何字符串超类型。满足条件。字符串不是int的子类型而使您绊倒的是红色鲱鱼,因为没有具体的类型是其他任何类型的子类型。