Julia 同时使用字符串和子字符串

Julia 同时使用字符串和子字符串,julia,Julia,鉴于: julia> SubString <: String false 我认为有两种方法可以做到这一点: 在函数定义中使用AbstractString而不是String 定义函数两次,一次用于字符串,一次用于子字符串,这将生成myfunction(具有两种方法的通用函数) 关键是子字符串是抽象字符串的子类型,而不是字符串。您可以通过输入supertype(SubString)看到这一点。我的经验如下:1)按照Mark的建议使用AbstractString。这应至少满足您99%的需

鉴于:

julia> SubString <: String
false

我认为有两种方法可以做到这一点:

  • 在函数定义中使用
    AbstractString
    而不是
    String

  • 定义函数两次,一次用于
    字符串
    ,一次用于
    子字符串
    ,这将生成
    myfunction(具有两种方法的通用函数)


  • 关键是
    子字符串
    抽象字符串
    的子类型,而不是
    字符串
    。您可以通过输入
    supertype(SubString)

    看到这一点。我的经验如下:1)按照Mark的建议使用
    AbstractString
    。这应至少满足您99%的需求,您可以使用其他字符串实现,例如从Strs.jl。2) 您可能会依赖以下事实,即您收到
    字符串
    子字符串{String}
    (例如,您希望使用
    字符串
    的特定内存布局);然后我建议使用
    Union{String,SubString{String}
    签名。通常,将类型签名指定为
    子字符串
    用处不大,因为
    子字符串
    不是一种具体类型(与例如
    子字符串{String}
    相反)。
    julia> function myfunction(ss::String)
               @show ss, typeof(ss)
           end
    myfunction (generic function with 1 method)
    
    julia> myfunction("Hello World")
    (ss, typeof(ss)) = ("Hello World", String)
    ("Hello World", String)
    
    julia> s = split("Hello World")
    2-element Array{SubString{String},1}:
     "Hello"
     "World"
    
    julia> foreach(x -> myfunction(x), s)
    ERROR: MethodError: no method matching myfunction(::SubString{String})
    Closest candidates are:
      myfunction(::String) at REPL[11]:2