最近在看一些包学习julia
struct Combination{T} <: AbstractMatrix{T}
A::Tuple
cumlength::Vector{Int}
end
function Combination(A::Union{AbstractVector{T}, AbstractMatrix{T}}...) where {T}
Combination{T}(A, cumsum([size(x, 2) for x in A]))
end
Base.size(c::Combination) = (size(c.A[1], 1), c.cumlength[end])
Base.size(c::Combination, i::Integer) = size(c)[i]
function Base.view(c::Combination, ::Colon, j)
index = searchsortedfirst(c.cumlength, j)
newj = index == 1 ? j : j - c.cumlength[index-1]
view(c.A[index], :, newj)
end
# new cell
Combination([1,2,3], [4,5,6])
# 以上为复现需要的代码
# 该代码在notebook中即会出现CanonicalIndexError: getindex not defined for Combination{Int64}
# 以下为原始代码
# 上面的示例中我用`[1,2,3], [4,5,6]`简化了了y, Xexo,他们本质是两个向量。
iterations = Int[]
convergeds = Bool[]
if false
Xall = Combination(y, Xexo, Xendo, Z)
else
# 因为没有iv,所以运行这个
Xall = Combination(y, Xexo)
println(typeof(Xall))
println("Xall")
println(Xall)
end
以上的代码可以成功运行
但是我发现println("Xall")
可以成功打印,而运行到println(Xall)
却报如下错误:
`CanonicalIndexError: getindex not defined for Combination{Float64}
一开始我觉得很奇怪,Xall不是算出来了吗?为啥不能打印呢?
再测试了下发现在jupyter notebook中
Xall = Combination(y, Xexo)
也会报如上的错误,我还以为是Xall没计算成功。
Xall = Combination(y, Xexo);
这样就可以,所以我猜测是这个Xall没有show对应的函数之类的。
那么我的疑问是:
- 1 我的猜想是否正确,如果正确,遇到这种情况,算不算julia的缺陷?因为我一开始真的猜不到报错的原因是这样
- 2 julia这样的设计,岂不是要单独为每一个新类型设计show方法?否则就不能查看?那会不会给调试和开发代理很大的困难,工作量也大了很多?
- 3 那么,如何知道当前的对象,到底能用哪些方法呢?