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