构造函数接受整数但不接受字符串

ard*_*aar 20 julia

这有效:

struct Comic
    endpoint::String
end

function Comic(id::Int)
    url = "https://xkcd.com/$id/info.0.json"
    Comic(url)
end


Comic(1)
Run Code Online (Sandbox Code Playgroud)

它返回Comic("https://xkcd.com/1/info.0.json")

这不起作用:

struct Comic
    endpoint::String
end

function Comic(id::String)
    url = "https://xkcd.com/$id/info.0.json"
    Comic(url)
end


Comic("1")
Run Code Online (Sandbox Code Playgroud)

它杀死了 Julia 进程。

为什么第二个例子不起作用?

Prz*_*fel 31

在您的代码中Comic("1")调用Comic(id::String).

Comic(id::String)调用Comic(url)这又意味着调用Comic(id::String)

所以你最终会陷入无限的递归循环。

  • 起初我很困惑为什么第一个示例不会导致相同的循环。现在我明白了。`Comic(1)` 调用 `Comic(id::Int)`,后者调用 `Comic(url)`,然后引用回 `struct Comic`。 (2认同)

sun*_*ica 18

另一个答案解释了为什么这会导致 Julia 进程崩溃;现在,为了使其按照您预期的方式工作,您可以简单地使用内部构造函数

julia> struct Comic
           endpoint::String
           Comic(id::String) = new("https://xkcd.com/$id/info.0.json")
       end

julia> Comic("1")
Comic("https://xkcd.com/1/info.0.json")

Run Code Online (Sandbox Code Playgroud)

这是可行的,因为new不会递归调用此构造函数(这会导致崩溃)。相反,它直接使用给定字符串作为其元素创建对象。

另一个需要考虑的选项是URIs.jl包。

julia> using URIs

julia> struct XComic
          endpoint::URI
       end

julia> XComic(id::String) = XComic(URI("https://xkcd.com/$id/info.0.json"))
XComic

julia> XComic("4")
XComic(URI("https://xkcd.com/4/info.0.json"))

Run Code Online (Sandbox Code Playgroud)