关于带参数类型的构造函数问题

萌新求问一个简单的代码问题.

abstract type AbstractArray1{T1,T2,T3,T4} end
struct grid{T1,T2,T3,T4} <: AbstractArray1{T1,T2,T3,T4}
    A::T1
    B::T2
    C::T3
    D::T4
    function grid{T1,T2,T3,T4}(t1,t2,t3,t4) where {T1<:Int64, T2<:Float64 , T3<:String , T4<:String}
        A = t1
        B = t2
        C = t3
        D = t4
        return new(A,B,C,D)
    end
end
u1 = grid(1,2.0,"hello","where")

执行后总是报错:

ERROR: LoadError: MethodError: no method matching grid(::Int64, ::Float64, ::String, ::String)
Stacktrace:

另,怎么写一个带多参数类型的外部构造函数?我不知道怎么在外部构造函数中返回对象.

文档给的资料似乎只能在终端中执行

# 这么写
u1 = grid{Int64, Float64 , String , String}(1,2.0,"hello","where")

# 
grid(t1::T1,t2::T2,t3::T3,t4::T4) where {T1<:Int64, T2<:Float64 , T3<:String , T4<:String} = grid{T1,T2,T3,T4}(t1,t2,t3,t4)

u2 = grid(1,2.0,"hello","where")
1 个赞

之所以报错的原因是因为你提供了内置构造函数 grid{T1,T2,T3,T4}(t1,t2,t3,t4), 所以这个变成了唯一的构造方式。楼上的解决方案是额外提供一个外置构造函数 grid(t1, t2, t3, t4)

除此之外,对于这种简单的情况,还有两种常见的方案:

Option1 :

# T1 <: Int64 这种是无意义的写法,因为 Int64 不是一个抽象的数据类型
# 在这种情况下,不需要参数化类型
struct grid <: AbstractArray1{Int,Float64,String,String}
    A::Int
    B::Float64
    C::String
    D::String
end

Option 2:

# 利用默认的构造函数
struct grid{T1,T2,T3,T4} <: AbstractArray1{T1,T2,T3,T4}
    A::T1
    B::T2
    C::T3
    D::T4
end
2 个赞

说得很详细,很感谢