这有效:
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)
所以你最终会陷入无限的递归循环。
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)