为什么show()在Julia中行为不一致?

时间:2016-01-08 05:58:34

标签: julia

我在Julia中的show行为不一致,具体取决于是显式调用还是来自REPL。什么是 one 方法,我可以重载,以便始终看到相同的输出?

具体来说,我正在定义一种新类型:

immutable Rigid3D{T<:Real}
    rotation::ImmutableArrays.Matrix3x3{T}
    translation::ImmutableArrays.Vector3{T}
end
带有show函数的

import Base.show

function show{T}(io::IO,trans::Rigid3D{T})
    println(io,typeof(trans))
    println(io,"- rotation:")
    println(io,trans.rotation)
    println(io,"- translation:")
    print(io,trans.translation)
end

当REPL显示我的函数时,我得到旋转矩阵的某种类型的输出,看起来像

RigidTransforms.Rigid3D{Float64}
- rotation:
3x3 ImmutableArrays.Matrix3x3{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0
- translation:
[0.0,0.0,0.0]

当我通过明确地调用showprint或类似内容获得我真正想要的内容时:

RigidTransforms.Rigid3D{Float64}
- rotation:
[1.0 0.0 0.0
 0.0 1.0 0.0
 0.0 0.0 1.0]
- translation:
[0.0,0.0,0.0]

3 个答案:

答案 0 :(得分:1)

对于数组来说似乎showarray / show有一些特殊的超级特殊全局变量“goodness”。通过显式设置一些标志可以得到我想要的输出,如

Base.showarray(io,trans.rotation,header=false,repr=true)

跟进问题:这是一个很好的方法吗?

答案 1 :(得分:1)

Julia Doc的

Section 45.3包含有关多媒体I / O的相关主题,请参阅本节,最多api创建对象的输出是display()函数,因此在任何地方调用{{1} } direct可以是一种创建标准输出的方法:

display()

创建对象的输出表示的下一个轮胎是 julia> r=rand(1:10,3,4) 3x4 Array{Int64,2}: 1 9 6 10 10 4 9 3 2 7 9 3 julia> display(r) 3x4 Array{Int64,2}: 6 9 10 6 7 10 3 8 10 3 1 3 函数,通常此函数由writemime()调用,具有合适的display()IO类型。 (查看来源:julia/base/multimedia.jl
因此,创建相同输出的另一种方法是调用MIME

writemime()

最后一个轮胎是julia> writemime(STDOUT,"text/plain",r) 3x4 Array{Int64,2}: 6 9 10 6 7 10 3 8 10 3 1 3 函数,请参阅show()如何利用它的不同实现来创建对象表示here
例如被调用以输出writemime() "text/plain"视图的那个看起来像:
Array

showarray(IOContext(io, :limit_output => true), v, header=true, repr=false)

但是从源可见,julia> Base.showarray(STDOUT, r, header=true, repr=false) 3x4 Array{Int64,2}: 6 9 10 6 7 10 3 8 10 3 1 3 使用writemime()类型来自定义输出,因此上述内容并不完全相同。要查看差异,请比较IOContext的输出:

rand(Int,4,5)

答案 2 :(得分:0)

据我所知,show仍然是重载的正确之处,事实上你已经为你自己的类型正确地重载了​​show

似乎正在发生的事情是showImmutableArrays包中的类型无法正常工作(?)。由于您没有提供工作代码,因此我无法创建您的类型的对象并进行彻底测试。

请注意,程序包FixedSizeArraysImmutableArrays的替代品,现在可供使用了。您可以测试使用该软件包时会发生什么吗?