首页 > 解决方案 > 抑制 Julia 中自定义结构的打印

问题描述

我有一个结构,最终有很多循环引用。它类似于:

mutable struct Friend
a                    :: Int64
b                    :: Float64
your_best_friend     :: Union{Nothing, Friend}
you_are_best_friend  :: Union{Nothing, Friend}
Friend() = new()
end

任何两个彼此最好的朋友都会在打印时引起循环引用。Julia 处理这些循环引用,因此打印不会永远消失,但我宁愿在创建 Friend 结构的变量时根本不打印。我知道 supressor.jl 是一个东西,但我想知道 Base Julia 是否有一个固有的解决方案。基本上,是否有结构选项,以便在不使用额外包的情况下分配时不打印对象?如果不是,那么下一个最好的事情是什么?我不是 CS 人,所以我不确定打印需要什么样的计算时间,但如果可能的话我想避免它(而且我不确定 supressor.jl 是否会删除打印时间或者打印是否仍然需要额外的时间,但只是不显示)。这对我来说似乎很简单,但我做不到 t 在文档中找到解决方案。抱歉,如果很明显,请提前致谢!

-J

标签: printingjuliastructure

解决方案


您需要重载 Base.show 以更改 REPL 显示对象的方式:

julia> mutable struct Friend
   a                    :: Int64
   b                    :: Float64
   your_best_friend     :: Union{Nothing, Friend}
   you_are_best_friend  :: Union{Nothing, Friend}
   Friend() = new()
   end

julia> Friend()
Friend(0, 0.0, #undef, #undef)

julia> import Base.show

julia> show(io::IO, f::Friend) = show(io, "Friend $(f.a)")
show (generic function with 223 methods)

julia> d = Friend()
"Friend 0"

请注意,如果您还想更改 REPL 命令行之外的打印方式,您可能还需要通过import Base.print


推荐阅读