::Type{T} 作为函数参数都有哪些用途?

在好多库里都看到类似这样的函数,一直不是很懂

function foo(::Type{T}, args...) where T

end

这种用法的意思很清楚:如果这个函数做dispatch只需要知道类型,而不需要知道值的话,那么就只传递类型。round(Int, 1.5) 就是这样的一个例子,你肯定不会想要 round(1, 1.5).

关于这种用法引申出去还有一个非常典型的例子是 holy trait

https://ahsmart.com/pub/holy-traits-design-patterns-and-best-practice-book/

3 个赞

请问这里的where T 是怎么解释呢?

摘取中文文档里的几段话吧


参数 T 也常被称为「类型变量」 ,因为它就像一个取值范围为类型的变量。每个 where 只引入一个类型变量,因此在具有多个参数的类型中这些表达式会被嵌套,例如 Array{T,N} where N where T。

类型变量可以用子类型关系来加以限制。 Array{T} where T<:Integer 指的是元素类型是某种 Integer的所有数组。语法 Array{<:Integer} 是 Array{T} where T<:Integer 的便捷的缩写。类型变量可同时具有上下界。Array{T} where Int<:T<:Number 指的是元素类型为能够包含 Int 的 Number 的所有数组(因为 T 至少和 Int 一样大)。语法 where T>:Int 也能用来只指定类型变量的下界,且 Array{>:Int}等价于 Array{T} where T>:Int。

由于 where 表达式可以嵌套,类型变量界可以引用更外层的类型变量。比如 Tuple{T,Array{S}} where S<:AbstractArray{T} where T<:Real 指的是二元元组,其第一个元素是某个 Real,而第二个元素是任意种类的数组 Array,且该数组的元素类型包含于第一个元组元素的类型。

2 个赞

oh谢谢,这个写法确实别具一格!

我好长一段时间都忽视了 T 除了是类型还是变量