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

为什么show()在Julia中的行为不一致?,julia,Julia,我在Julia中的show中有不一致的行为,这取决于是显式调用还是从REPL调用。我可以重载的方法是什么,以便始终看到相同的输出 具体而言,我定义了一种新类型: immutable Rigid3D{T<:Real} rotation::ImmutableArrays.Matrix3x3{T} translation::ImmutableArrays.Vector3{T} end 当REPL显示我的函数时,我得到旋转矩阵的某种类型的输出,如下所示 RigidTransfor

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

具体而言,我定义了一种新类型:

immutable Rigid3D{T<:Real}
    rotation::ImmutableArrays.Matrix3x3{T}
    translation::ImmutableArrays.Vector3{T}
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]
当我通过明确调用
show
print
或类似命令来获得我真正想要的东西时:

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]

似乎
showarray
/
show
因为数组中加入了一些额外的超级特殊全局变量“goodness”。可以通过显式设置一些标志来获得我想要的输出,如

Base.showarray(io,trans.rotation,header=false,repr=true)
后续问题:这是一种很好的方法吗?

的Julia Doc包含有关多媒体I/O的相关主题,请参阅本节,创建对象输出的最高级api是
display()
函数,因此直接调用
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
MIME
类型调用。(检查来源:)
因此,创建相同输出的另一种方法是调用
writemime()

最后一个轮胎是
show()
函数,请参见
writemime()
如何利用它的不同实现来创建对象表示。
e、 g.被调用以输出
数组的
视图的
“text/plain”
如下所示:
showarray(IOContext(io,:limit\u output=>true),v,header=true,repr=false)

但是,从源代码中可以看到,
writemime()
使用
IOContext
类型自定义输出,因此上述内容并不完全相同。要查看差异,请比较兰德(Int,4,5)
的输出:


据我所知,
show
仍然是重载的正确方法,事实上,对于您自己的类型,您已经正确地重载了
show

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

请注意,包
FixedSizeArrays
ImmutableArrays
的替代品,现在可以使用了。你能测试一下当你使用这个软件包时会发生什么吗

 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
julia> writemime(STDOUT,"text/plain",r)
3x4 Array{Int64,2}:
  6   9  10  6
  7  10   3  8
 10   3   1  3
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
julia> r=rand(Int,4,5);

julia> Base.showarray(STDOUT, r, header=true, repr=false);
4x5 Array{Int64,2}:
 -9150711412447851532  -4064307792165254874  -9145005121012096632   877869689862
3596311  -1624484174873216444
 -6072167451473199347   3776198281339796836   2251800342396330066   278057847557
1491665  -3073806755949099776
 -6526051806709869625  -1478837742375450002  -4067570915681650210   818574986937
5316317  -5612815197244826930
  3274244289756062731   2761828107403369455   1969450819804018106  -130408388331
4107544   6697765697249990460
julia> r
4x5 Array{Int64,2}:
 -9150711412447851532  -4064307792165254874  .  -1624484174873216444
 -6072167451473199347   3776198281339796836     -3073806755949099776
 -6526051806709869625  -1478837742375450002     -5612815197244826930
  3274244289756062731   2761828107403369455      6697765697249990460