朱莉娅:多种类型的相同功能?

Dom*_*ski 5 methods function dispatch julia

我有一个在向量上定义的大函数,但我希望它也可以使用单个值。我希望第一个参数的类型是向量或数字。

我尝试以下方法:

function bigfunction(x::Vector, y::Float64=0.5)

  # lots of stuff
  z = x .+ y
  return z
end


bigfunction(x::Number) = bigfunction()
Run Code Online (Sandbox Code Playgroud)

该函数适用于向量,但不适用于数字。

bigfunction([0, 1, 3])
bigfunction(2)
Run Code Online (Sandbox Code Playgroud)

Union{}我应该像有时看到的那样做一些事情吗?或者以不同的方式重新定义方法?

Jul*_*ner 4

这个问题和回答帮助我说明了 Chris Rackauckas 在 Julia 中的类型调度的精彩博客文章中提出的观点。

\n\n

我已将回复整理成以下代码:

\n\n
# I ran this only in Julia 1.0.0.\n\n## ========== Original function ==========\n## function bigfunction(x::Vector, y::Float64=0.5)\n##     # lots of stuff\n##     z = x .+ y\n##     return z\n## end\n## bigfunction(x::Number) = bigfunction()\n## println(bigfunction([0, 1, 3]))\n## println(bigfunction(2))\n## ---------- Output has ERROR ----------\n## [0.5, 1.5, 3.5]\n## ERROR: LoadError: MethodError: no method matching bigfunction()\n\n\n# ========== Answer Suggested by Picaud Vincent in comments ==========\n# Note use of Union in function signature.\nfunction bigfunction(x::Union{Vector, Number}, y::Float64=0.5)\n    # lots of stuff\n    z = x .+ y\n    return z\nend\nprintln(bigfunction([0, 1, 3]))\nprintln(bigfunction(2))\n## ---------- Output Okay ----------\n## [0.5, 1.5, 3.5]\n## 2.5\n\n\n# ========== Answer Suggested by Robert H\xc3\xb6nig in comments ==========\n# Note change in line right after function definition.\nfunction bigfunction(x::Vector, y::Float64=0.5)\n    # lots of stuff\n    z = x .+ y\n    return z\nend\nbigfunction(x::Number) = bigfunction([x])\nprintln(bigfunction([0, 1, 3]))\nprintln(bigfunction(2))\n## ---------- Output Okay ----------\n## [0.5, 1.5, 3.5]\n## 2.5\n\n\n# ========== Answer Suggested by Chris Rackauckas ==========\n# Note change in function signature using duct typing--no type for x.\nfunction bigfunction(x, y=0.5)\n    # lots of stuff\n    z = x .+ y\n    return z\nend\nprintln(bigfunction([0, 1, 3]))\nprintln(bigfunction(2))\n## ---------- Output Okay ----------\n## [0.5, 1.5, 3.5]\n## 2.5\n
Run Code Online (Sandbox Code Playgroud)\n