1

我有两个具有相同名称和相同数量的“正常”参数的方法。但是,它们在关键字参数的数量上有所不同(它们都是非可选的)。

我认为以下最小示例很好地说明了我的观点:

julia> f(a; b) = a+b
f (generic function with 1 method)

julia> f(a; b, c)= a+b+c
f (generic function with 1 method)

julia> f(1; b=1)
ERROR: UndefKeywordError: keyword argument c not assigned
Stacktrace:
 [1] top-level scope
   @ REPL[72]:1

julia> f(1; b=1, c=2)
4

输出的第二行(“f(带有 1 个方法的通用函数)”)已经表明 Julia 不明白我想要什么 - 它应该是2 个方法(例如,如果我写的话f(a, b; c) = a+b+c)。

我已经在 J​​ulia discourse forum 中找到了这个,这似乎解释了为什么这对多次调度不起作用。但是,在我的情况下,不是类型而是计数不同,所以我希望有一个(整洁的)解决方案。


关于我为什么想要这个:我有一个函数可以为不同的分子进行一些计算(准确地说是计算斯塔克曲线)。该函数需要针对不同的分子类型(准确地说是不同的对称性)采取不同的行动,并且还需要不同的参数(不同的量子数)。

所以这就是我需要多次调度的原因——但是为什么要使用关键字参数,你可能会问。那是因为我使用分布创建量子数并将它们NamedTuple....

我不想改变这种行为,但也许你很好奇我为什么需要这样的东西。

4

1 回答 1

1

在您的示例中,您可以重用关键字参数作为位置参数以使其f(1; b=1)工作,但它的行为不像真正的关键字调度。一方面,f(1; c=2)会打电话给_f(a,b).

function f(a; b=missing, c=missing)
    _f(a, skipmissing((b, c))...)
end

_f(a,b,c) = a+b+c
_f(a,b) = a+b

不确定这是否适用于您描述的实际用例,但是,事情可能比band更难重新排序c,并且正如评论指出的那样, a NamedTuple(已排序)已经可以调度。

于 2021-10-27T12:24:54.880 回答