2015-12-03 22 views
5

I N tipi parametrenin bir fonksiyonu olan bir FixedSizeArrays.Vec {N, T} çevresinde bir tür tanımlamak istediğiniz izin verilmez Bu hata iletisine neden olur:İfadeler

ERROR: MethodError: `+` has no method matching +(::TypeVar, ::Int64) 
Closest candidates are: 
    +(::Any, ::Any, ::Any, ::Any...) 
    +(::Int64, ::Int64) 
    +(::Complex{Bool}, ::Real) 
    ... 

Görünüşe göre, tamsayı tipi parametreleri ile basit aritmetik sonucu derleme zamanında bilinmesi bile, izin verilmez. Bu sınırlama için bir çözüm bilen var mı?

cevap

6

Görünüşe göre, tamsayı tipi parametreleri ile basit aritmetik bu tip parametrelerle bir sınırlamadır,

Evet

izin verilmez. Bunun etrafındaki standart yol, ikinci tip bir parametredir.

type MT{N,Np1} 
    x::Vec{N,Int} 
    y::Vec{Np1,Int} 
    function MT(x,y) 
     N+1==Np1 || throw(ArgumentError("mismatched lengths; y must be one element longer than x")) 
     new(x,y) 
    end 
end 
# Since we define an inner constructor, we must also provide the 
# outer constructor to allow calling MT without parameters 
MT{N,M}(x::Vec{N,Int}, y::Vec{M,Int}) = MT{N,M}(x,y) 

Örnek:

julia> MT(Vec(1,2,3),Vec(1,2,3,4)) 
MT{3,4}(FixedSizeArrays.Vec{3,Int64}((1,2,3)),FixedSizeArrays.Vec{4,Int64}((1,2,3,4))) 

julia> MT(Vec(1,2,3),Vec(1,2,3)) 
ERROR: ArgumentError: mismatched lengths; y must be one element longer than x 
Daha sonra, bir iç kurucu ile parametre değişmezleri zorlayabilir