我可以创建类型别名来指定 std 容器的分配器吗?

问题描述 投票:0回答:2

我想使用我的自定义分配器为 std 中的容器定义类型别名,例如

type MyBox<T> = Box<T, A=MyAlloc>;

但是有人告诉我

error[E0229]: associated type bindings are not allowed here
  --> src/lib.rs:12:24
   |
12 | type MyBox<T> = Box<T, A=MyAlloc>;
   |                        ^^^^^^^^^ associated type not allowed here

为什么不允许这样做,是否有一些解决方法(每晚都可以)?

游乐场链接: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=0750f38d63ace7e44d6494e062538ae4

rust
2个回答
0
投票

默认类型始终位于 A 的泛型类型

definition
上(此处缺少 - 您将
A
用作泛型类型而不定义它),而不是在使用该类型的位置。这有效:

type MyBox<T, A = MyAlloc> = Box<T, A>;

0
投票

您不需要

A=

type MyBox<T> = Box<T, MyAlloc>;

这就是您所需要的。放置

A=
尝试在关联类型上定义约束,而不是类型参数。也就是说,在函数签名中,您可以编写

fn foobar<I>(iterator: I)
where I: Iterator<Item = u32>;

限制您的函数仅接受元素类型为

u32
的迭代器。这是因为
Iterator::Item
是在 impl
Iterator
内部定义的
关联类型
(或更准确地说,是其实现者的
impl
),而
A
中的
Box<T, A>
是简单类型参数,因此您可以在不使用其名称的情况下引用它。

关联的类型约束在类型别名中没有意义,这就是您收到该错误的原因。

© www.soinside.com 2019 - 2024. All rights reserved.