为什么会引发LoadError: UndefVarError: T not defined
:
struct Point{T}
x::T
y::T
Point{T}(x,y) = new(x,y)
end
这可以正常工作:
struct Point{T}
x::T
y::T
Point{T}(x,y) where {T} = new(x,y)
end
?
似乎曾经很不错:this
编辑:为澄清起见,我希望我们在struct Point{T}
块内,甚至在第一种情况下也能清楚地知道T
所指的事实。
答案 0 :(得分:2)
没有where
子句T
是从全局范围继承的(这有点令人惊讶,但这是它的工作方式):
julia> T = String
String
julia> struct Point{T}
x::T
y::T
Point{T}(x,y) = new(x,y)
end
julia> Point{String}("b","a")
Point{String}("b", "a")
julia> Point{String}(SubString("b",1,1),SubString("a",1,1))
Point{String}("b", "a")
julia> Point{Int}(1, 2)
ERROR: MethodError: no method matching Point{Int64}(::Int64, ::Int64)
julia> Point{String}(1, 2)
ERROR: MethodError: Cannot `convert` an object of type Int64 to an object of type String
编辑
给出关于“话语”的评论,简短的答案是,这样做的原因是T
中的struct
在调用内部构造函数时是未知的。