Julia中构造函数方法的多重分派



我写了一个结构体,我想有一个构造函数方法,支持向量和元组输入的参数barrierPositions

struct MapInfo
mapSize::Tuple{Int64, Int64}
flagPosition::Tuple{Int64, Int64}
barrierPositions::Vector{Tuple{Int64, Int64}}
function MapInfo(;mapSize::Tuple{Int64, Int64}, flagPosition::Tuple{Int64, Int64}, 
barrierPositions::Vector{Tuple{Int64, Int64}})
unique!(barrierPositions)
deleteat!(barrierPositions, findall(x->x==flagPosition, barrierPositions))
return new(mapSize, flagPosition, barrierPositions)
end
function MapInfo(;mapSize::Tuple{Int64, Int64}, flagPosition::Tuple{Int64, Int64}, 
barrierPositions::Tuple{Int64, Int64})
return MapInfo(mapSize=mapSize, flagPosition=flagPosition, barrierPositions=[barrierPositions])
end
end

但是如果我运行下面的命令,它似乎忽略了我的第一个构造函数方法,它应该接收参数barrierPositions的向量。

mapInfo = MapInfo(mapSize=(4,4), flagPosition=(3,3), barrierPositions=[(3,2), (2,3)])
ERROR: TypeError: in keyword argument barrierPositions, expected Tuple{Int64, Int64}, got a value of type Vector{Tuple{Int64, Int64}}
Stacktrace:
[1] top-level scope
@ e:Master Thesislu_jizhouLearningDQN.jl:250

我该怎么做?

Julia不调度关键字参数,只调度位置参数(在;之前)。通常,如果需要这样的可选输入,最好使用外部构造函数。

一个例子:

struct MapInfo
mapSize::Tuple{Int64, Int64}
flagPosition::Tuple{Int64, Int64}
barrierPositions::Vector{Tuple{Int64, Int64}}
function MapInfo(mapSize::Tuple{Int64, Int64}, flagPosition::Tuple{Int64, Int64}, 
barrierPositions::Vector{Tuple{Int64, Int64}})
unique!(barrierPositions)
deleteat!(barrierPositions, findall(x->x==flagPosition, barrierPositions))
return new(mapSize, flagPosition, barrierPositions)
end
end

function MapInfo(;mapSize::Tuple{Int64, Int64}, flagPosition::Tuple{Int64, Int64}, 
barrierPositions::Tuple{Int64, Int64})
return MapInfo(mapSize, flagPosition, [barrierPositions])
end
注意,在这个例子中,内部构造函数是而不是。外部构造函数是基于关键字的,但是你不能有多个没有位置参数的构造函数,因为分派只在位置参数上完成。(两个没有位置参数的方法是相同的方法,因此最后一个方法将取代第一个方法)。

如果你需要更多的构造函数,你必须有不同的位置参数。即删除形式参数列表中的;

使用外部构造函数没有什么神奇之处,你也可以使用内部构造函数。如果有测试和一致性检查,通常使用内部构造函数。您可以将其编写为内部构造函数,其中调用new而不是MapInfo,并避免使用unique!,这对于单个Tuple来说是不必要的(并简化deletat!/findall逻辑)。

最新更新