使用字符串和子字符串

day*_*ter 5 julia

鉴于:

julia> SubString <: String
false
Run Code Online (Sandbox Code Playgroud)

你将如何编写一个接受子字符串和字符串的函数?

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*tle 4

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

  1. 在函数定义中使用AbstractString而不是;String

  2. 定义该函数两次,一次 for String,一次 for SubString,这将生成myfunction (generic function with 2 methods).

关键是SubString是 的子类型AbstractString,而不是String。您可以通过输入来看到这一点supertype(SubString)

  • 我的经验如下:1)按照 Mark 的建议使用 `AbstractString`。这应该至少能满足您 99% 的需求,并且您可以使用其他字符串实现,例如来自 Strs.jl 的字符串实现。2) 您有可能依赖于收到 `String` 或 `SubString{String}` 的事实(例如,您想使用 `String` 的特定内存布局);那么我建议使用“Union{String, SubString{String}}”签名。一般来说,将类型签名指定为“SubString”几乎没有什么用处,因为“SubString”不是具体类型(与“SubString{String}”相反)。 (3认同)