Julia中的参数复合类型内部构造函数:为什么需要'where{T}'?

Julia中的参数复合类型内部构造函数:为什么需要'where{T}'?,julia,Julia,为什么会引发LoadError:UndefVarError:T未定义: 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 ? 似乎从前他们都很好: 编辑:为了澄清这一点,我本以为我们在结构点{T}块中这一事实已经清楚地表明了T在第一种情况下

为什么会引发
LoadError:UndefVarError:T未定义

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
?

似乎从前他们都很好:


编辑:为了澄清这一点,我本以为我们在
结构点{T}
块中这一事实已经清楚地表明了
T
在第一种情况下所指的内容。

编辑


简短的回答是,鉴于对论述的评论,其原因是
struct
T
在调用内部构造函数的那一刻并不为人所知。

我发现这有点令人惊讶和困惑,特别是考虑到以下几点很好:``T=String struct Point{T}x::T y::T end Point{Int64}(1,2)``因此,内部构造函数声明中的
T
来自全局范围,但是
struct
T
不来自全局范围,即使前者在后者之内。这对吗?请注意,这样我们将看到其他人的想法(不管这是否令人惊讶-可能背后有更深层次的原因)。通常,
struct
定义中的参数与内部构造函数中的参数分离(这就是为什么可以使用
where
更改它的原因),但也许-正如您所说-它应该作为外部作用域从
struct
默认继承。我不想成为字符串!!如何将其作为类型参数?
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