Julia 朱莉娅:我如何将函数的参数类型定义为元组数组?

Julia 朱莉娅:我如何将函数的参数类型定义为元组数组?,julia,Julia,我有一个元组的一维数组,需要传递给一个定义为 function f(a::Array{Tuple{Vararg{String}}, 1}) #do some processing end 每个元组可以有任意数量的字符串元素,但数组中所有元组的元素数量相同。例如,数组可能看起来像[(“x1”、“x2”),(“y1”、“y2”)]或[(“x1”、“x2”、“x3”),(“y1”、“y2”、“y3”)]等。因此,使用Vararg{String}来实现此目的 现在,当我运行f([((“x1”

我有一个元组的一维数组,需要传递给一个定义为

function f(a::Array{Tuple{Vararg{String}}, 1}) 
    #do some processing
end
每个元组可以有任意数量的字符串元素,但数组中所有元组的元素数量相同。例如,数组可能看起来像
[(“x1”、“x2”),(“y1”、“y2”)]
[(“x1”、“x2”、“x3”),(“y1”、“y2”、“y3”)]
等。因此,使用Vararg{String}来实现此目的

现在,当我运行
f([((“x1”,“x2”),(“y1”,“y2”)])
时,它会抛出一个错误

MethodError:没有与f匹配的方法(::数组{Tuple{String,String},1})


我应该如何修改函数定义以使其生效?

您可以将签名修改为

function f(a::Array{<:Tuple{Vararg{String}}, 1})
    #do some processing
end

函数f(a::Array{您得到这个
MethodError
,因为
Tuple{Vararg{T}}
不是一个具体的类型,因为
Vararg
的元素数没有指定,而不是协变的


即使我们有
Tuple{Vararg{String,5}},您也可以在函数调用中省略类型描述。@niczky12我需要确保调用方发送的Tuple只包含我的用例的字符串元素。这是一个非常好的答案,另外一个注释是您可能想要编写一个类似
g(a::Vector{T})的签名在哪里{T@BogumiłKamiński感谢您的评论!我将编辑我的答案以反映您的评论,但OP也希望强制每个元组中的元素数量。可以使用
f(a::Vector{T}),其中{TGood point(我忘记了这个限制)-我认为-当你写的时候,你必须把
N
带到
之外的
那里
,所以写它的最短方法可能是
g(a::Vector{这个方法签名不够精确(见@hckr的答案和评论中的讨论),因为它允许元组具有不同的长度(在我的第一个提案中,我也忘记了这个限制)。我只是想把这个评论留给未来可能的读者——区别是什么。
julia> Tuple{Vararg{String, 5}} <: Tuple{Vararg{String}}
true

julia> Vector{Tuple{Vararg{String, 5}}} <: Vector{Tuple{Vararg{String}}}
false
function f(a::Vector{<:Tuple{Vararg{String}}})
# or
function f(a::Vector{T}) where {T <: Tuple{Vararg{String}}
f([("x1, x2"), ("y1", "y2", "y3"])
function f(a::Vector{Tuple{Vararg{String, N}}}) where N 
    ...
end
function f(a::Vector{NTuple{N, String}}) where N

end
function f(a::Vector{<:NTuple{N, AbstractString}}) where N
...
end