如果首先调用“show”,为什么“show”重载不起作用?

col*_*ang 2 julia

一般

julia> Base.show(io::IO, a::Int) = print(io, "xx")
show (generic function with 98 methods)

julia> show(2)
xx
Run Code Online (Sandbox Code Playgroud)

它被正确重载。

但是,如果我show在重载之前调用,它不会重载,也不会发出任何警告。

julia> show(1)
1
julia> Base.show(io::IO, a::Int) = print(io, "xx")
show (generic function with 98 methods)

julia> show(2)
2
julia> Base.show(2)
2
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Toi*_*son 5

这是一个长期悬而未决的问题, #265。当你调用时show(2),它会依次调用show(STDIN, 2),但那些函数在你调用时已经被编译过show(1),并且由于这个问题,依赖的函数show(::Int)不会被重新编译。

当然,在代码中依赖某个行为之后,您应该很少需要更改该行为。一般来说,没有人知道如何Base通过更改已经存在的行为来破坏现有代码,例如库。另一方面,为新类型添加行为很好。