gpt4 book ai didi

struct - Julia 中构造函数方法的多重分派(dispatch)

转载 作者:行者123 更新时间:2023-12-05 04:19:38 26 4
gpt4 key购买 nike

我已经编写了一个结构体,我想要一个构造函数方法来支持参数 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 Thesis\lu_jizhou\Learning\DQN.jl:250

我该怎么做?

最佳答案

Julia 不分派(dispatch)关键字参数,只分派(dispatch)位置参数(在 ; 之前)。通常,如果您想要这样的替代输入,通常最好使用外部构造函数。

一个例子:

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

请注意,在此示例中,内部构造函数不是 by 关键字。外部构造函数是基于关键字的,但是你不能有多个没有位置参数的构造函数,因为分派(dispatch)仅在位置参数上完成。 (两个没有位置参数的方法是同一个方法,所以最后一个将替换第一个)。

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

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

关于struct - Julia 中构造函数方法的多重分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74753808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com