Julia中的参数化复合类型内部构造函数:为什么“ where {T}”是必需的?

时间:2019-03-25 10:33:37

标签: julia

为什么会引发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所指的事实。

1 个答案:

答案 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在调用内部构造函数时是未知的。