Julia: 如何定义一个带有可选的 Vector 类型参数且默认值为 null 的函数?

4
我有一个函数f(x)。我想让这个函数有一个可选的向量类型参数。例如,f(x; y::Vector=[1,2,3])。然而,我希望默认值是其他值(null?missing?void?),以便我可以轻松地捕捉它并做出反应。
在R中,我会写成function(x, y=NULL){},然后用if(is.null(y)){whatever}来判断。
在Julia中,最佳方式是什么?

可能是[Julia带有NULL参数的函数]的重复问题(https://dev59.com/GKfja4cB1Zd3GeqPs0BF)。 - Engineero
1个回答

12

Engineero评论中提到的模式最为简洁,但它假设有一个位置参数。如果你坚持想在函数中使用关键字参数(正如你在问题中所做的),请使用以下内容:

Engineero提到的模式最为简洁,但是它假定了位置参数。如果你想在函数中使用关键字参数(就像你在问题中做的那样),可以使用下面的方法:

function f(x; y::Union{Vector, Nothing}=nothing)
    if y === nothing
        # do something
    else
        # do something else
    end
end

只有在你有很多关键字参数的情况下,通常才需要这样做,否则我建议使用具有不同位置参数签名的方法进行定义。

当然,如果您发现更喜欢,也可以对位置参数使用这种“什么也没有”的模式。


该死...每次我检查这门语言时,一切都又变了... Nullable 怎么了? - Tasos Papastylianou
2
它已经移动到了 Nullables.jl 包中。简而言之:现在你有一个 nothing,它是 Nothing 的单例实例,并且由于 Julia 1.0 的改进,推荐的风格是使用联合类型,如 Union{Int, Nothing},然后 nothing 表示值的缺失(因此有时必须使用 Some 类型来区分值的缺失和 nothing 是有效值的情况)。 - Bogumił Kamiński
值得注意的是,由于更近版本中的联合分裂优化,您解决方案中的代码应该是快速的:https://julialang.org/blog/2018/08/union-splitting - Moustache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接