使用类型别名时,Julia(v1.0
)不会在方法定义之外传播自由类型参数:
const RT{R<:Real} = Type{R}
rt(::RT{R}) where R = R
rt2(::Type{R}) where {R<:Real} = R
# there's more logic here for other subtypes
这对R<:Real
很好:
julia> rt(Int), rt2(Int) # works for both
(Int64, Int64)
但是rt()
自由接受非<:Real
输入
julia> rt(Char)
Char
julia> rt2(Char)
MethodError: no method matching rt2(::Type{Char})
似乎rt2
跟踪着<:Real
的上限,但是rt
却没有:
julia> methods(rt)
# 1 method for generic function "rt":
[1] rt(::Type{R}) where R in Main at REPL[2]:1
julia> methods(rt2)
# 1 method for generic function "rt2":
[1] rt2(::Type{R}) where R<:Real in Main at REPL[3]:1
总有没有自动将R<:Real
约束包含在类似类型别名的语句中?
答案 0 :(得分:2)
您可以编写(编辑):
rt(r::RT) = r
现在
julia> methods(rt)
# 1 method for generic function "rt":
[1] rt(r::Type{R} where R<:Real) in Main at REPL[16]:1
julia> rt(Int)
Int64
,所有工作均按预期进行。看起来方法定义中的where
子句(如果存在)将覆盖const
中的约束。我不确定这是否有意。