今天我在这里遇到了这种语法:
https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example
fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context>
where
(): IntRadixParse<Stream, Context, u8>,
{
uint_radix(2, Radix::HEX).parse(stream)
}
对我来说,它看起来像“绑定在单位类型(又名空元组)”,但我无法理解它。默认情况下,单一类型不会实现每个特征,不是吗?不幸的是,官方文档太模糊且不够完整,我找不到任何相关内容。
原始 RFC for
where
子句也提到了这个语法,但没有正确的解释:fn increment<T>(c: T) -> T
where () : Add<int,T,T>
{
1 + c
}
但除此之外,我知道这样的界限不仅可以在特征泛型中指定。
那么它是什么,什么时候使用,为什么需要它,它解决哪些问题?
是的,这是单位类型的限制。
单位类型并没有实现许多有用的特征(尽管它确实实现了一些,例如
Debug
),但是在 Rust 中,你可以实现外来类型的特征,只要该特征是你自己的,或者在有限的情况下,即使该特征不是你的,但它的一些通用参数是。所以这个库可能定义了 IntRadixParse
类型,并为单位类型实现它。