我在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]
当我通过明确地调用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]
答案 0 :(得分:1)
对于数组来说似乎showarray
/ show
有一些特殊的超级特殊全局变量“goodness”。通过显式设置一些标志可以得到我想要的输出,如
Base.showarray(io,trans.rotation,header=false,repr=true)
跟进问题:这是一个很好的方法吗?
答案 1 :(得分:1)
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
。
似乎正在发生的事情是show
对ImmutableArrays
包中的类型无法正常工作(?)。由于您没有提供工作代码,因此我无法创建您的类型的对象并进行彻底测试。
请注意,程序包FixedSizeArrays
是ImmutableArrays
的替代品,现在可供使用了。您可以测试使用该软件包时会发生什么吗?