Julia 我如何创建一个方法,该方法接受任何可编辑的字符串集合?

Julia 我如何创建一个方法,该方法接受任何可编辑的字符串集合?,julia,Julia,我有一个函数,f。我想添加一个方法,它接受Strings的任何容器。例如,我想编写一个在需要时生成以下内容的方法: f(xs::Array{String, 1}) = ... f(xs::DataArray{String, 1}) = ... f(xs::ITERABLE{String}) = ... 这在朱莉娅的打字系统中可以做到吗?现在,我正在使用宏在需要时编写专门的方法 @make_f(Array{String, 1}) @make_f(DataArray{String, 1}) 这样

我有一个函数,
f
。我想添加一个方法,它接受
String
s的任何容器。例如,我想编写一个在需要时生成以下内容的方法:

f(xs::Array{String, 1}) = ...
f(xs::DataArray{String, 1}) = ...
f(xs::ITERABLE{String}) = ...
这在朱莉娅的打字系统中可以做到吗?现在,我正在使用宏在需要时编写专门的方法

@make_f(Array{String, 1})
@make_f(DataArray{String, 1})

这样可以保持干燥,但感觉……不对。

至少在Julia 0.4中,以下功能应该可以工作:

julia> abstract Iterable{T} <: AbstractVector{T}

julia> f{T<:Union{Vector{String},Iterable{String}}}(xs::T) = 1
f (generic function with 1 method)

julia> x = String["a", "é"]
2-element Array{AbstractString,1}:
 "a"
 "é"

julia> f(x)
1
julia>abstract Iterable{T}f{T x=String[“a”,“é”]
2元素数组{AbstractString,1}:
“a”
"é"
julia>f(x)
1.

您不能只使用duck类型吗?即,假设您正在为函数提供正确类型的对象,并在某个点(例如,您的iterable中没有字符串)抛出错误

一旦你真的可以用traits谈论iterable,这应该会有所改进;目前还没有iterable类型。例如,Scott的答案将不适用于字符串的元组,即使它是iterable

例如


我专门研究一个已经有几个专门方法的函数。而且,我不想添加标签或任何东西来进行适当的分派。另外,看到twitter追随者(你和Scott)的回答很酷!我正在使用
f(xs…
),所以在调用站点
f(我的数组…
f(我的元组…
julia> f(x) = string(x...)  # just concatenate the strings
f (generic function with 1 method)

julia> f(("a", "á"))
"aá"

julia> f(["a", "á"])
"aá"

julia> f(["a" "b"; "c" "d"])  # a matrix of strings!
"acbd"