萌新求问一个简单的代码问题.
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 个赞