Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia中复合类型的自定义显示_Julia_Read Eval Print Loop - Fatal编程技术网

Julia中复合类型的自定义显示

Julia中复合类型的自定义显示,julia,read-eval-print-loop,Julia,Read Eval Print Loop,假设您在Julia中定义了一个新的复合类型和该类型的变量: type MyType α::Int64 β::Vector{Float64} γ::Float64 MyType(α::Int64, β::Vector{Float64}, γ::Float64) = new(α, β, γ) end mt = MyType(5, [1.2, 4.1, 2], 0.2) 现在,如果您处于REPL模式,只需输入mt并按Enter键,即可检查mt的值: mt MyType(5,[1.2

假设您在Julia中定义了一个新的复合类型和该类型的变量:

type MyType
  α::Int64
  β::Vector{Float64}
  γ::Float64

  MyType(α::Int64, β::Vector{Float64}, γ::Float64) = new(α, β, γ)
end
mt = MyType(5, [1.2, 4.1, 2], 0.2)
现在,如果您处于REPL模式,只需输入
mt
并按Enter键,即可检查
mt
的值:

mt
MyType(5,[1.2,4.1,2.0],0.2)
如果我想自定义
MyType
变量的显示方式,我可以定义一个函数并像
customized\u display(mt)
那样使用它:

但是使用另一个函数来显示
mt
的值似乎是多余的。我需要扩展哪个功能,以便只需键入
mt
,即可显示自定义显示?

您应该定义以下功能之一(它们都可以工作,并且具有相同的效果):


注意:从Julia 0.5及更高版本开始,Spenceryon2的答案不再正确

根据你的类型

type MyType
    α::Int64
    β::Vector{Float64}
    γ::Float64
end
如果要自定义单行显示,请将方法添加到
Base.show
,如下所示:

function Base.show(io::IO, me::MyType)
    print(io, "MyType: α:", me.α, " β:", me.β, " γ:", me.γ)
end
function Base.show(io::IO, ::MIME"text/plain", me::MyType)
    println(io, "MyType")
    print(io, "α:", me.α, " β:", me.β, " γ:", me.γ)
end
正在使用的单线显示示例:

julia> [MyType(5, [1.2, 4.1, 2], 0.2)]
1-element Array{MyType,1}:
 MyType: α:5 β:[1.2, 4.1, 2.0] γ:0.2
按照惯例,此方法不应包含任何换行符。这样,当嵌入到其他对象(如数组或矩阵)中时,它可以很好地显示。通常,最好将可以解析和计算的内容输出到与所显示的对象相同的对象中,但这不是一个硬性规则

如果要自定义多行显示,请将方法添加到
Base.show
,如下所示:

function Base.show(io::IO, me::MyType)
    print(io, "MyType: α:", me.α, " β:", me.β, " γ:", me.γ)
end
function Base.show(io::IO, ::MIME"text/plain", me::MyType)
    println(io, "MyType")
    print(io, "α:", me.α, " β:", me.β, " γ:", me.γ)
end
请注意,如果不包括此方法,则将使用单线显示。当对象单独显示时,在REPL处使用多行显示:

julia> MyType(5, [1.2, 4.1, 2], 0.2)
MyType
α:5 β:[1.2, 4.1, 2.0] γ:0.2

按照惯例,多行显示不应打印任何尾随的新行。

您可以为您的类型自定义
writemime
方法,例如,
Base.writemime(io::io,::MIME“text/plain”,mt::MyType)=println(mt.α)
。这正是我所要寻找的。这就引出了一个问题:那有什么区别呢?我认为这是正确的,但请更正:在REPL中,
display
调用
writemime
,默认为
showlimited
,然后调用
show
。所以两者都可以工作,但是如果两者都被定义,那么就会调用
writemime
one。谢谢@jverzani。重要的是在这里有这些信息。这个答案在0.5及更高版本中已经过时。请参阅以获取最新的解决方案。