在Julia中对函数签名和调度行为的澄清

问题描述 投票:5回答:1

[我正在尝试使用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)...

julia typing dispatch
1个回答
1
投票

这里发生的是T可以是数据类型,U可以是任何字符串超类型。满足条件。字符串不是int的子类型而使您绊倒的是红色鲱鱼,因为没有具体的类型是其他任何类型的子类型。

© www.soinside.com 2019 - 2024. All rights reserved.