Rust 为什么要执行范围限制<;T>;对于范围<&;T>;需要调整T的大小吗?

Rust 为什么要执行范围限制<;T>;对于范围<&;T>;需要调整T的大小吗?,rust,Rust,范围的impl RangeBounds{ fn开始\u绑定(&self)->绑定{ 包括(自启动) } fn结束\u绑定(&self)->绑定{ 排除(self.end) } } 如您所见,T没有标记为?size,这会阻止我将范围传递到参数requiresimpl RangeBounds 它背后是否有一些设计考虑?如果这是有意的,那么传递[u8]范围的正确方法是什么?这是非常不幸的,但是添加T:?Sized绑定会中断代码中的类型推断,比如btreemap.range(“from”。“.”to”

范围的impl RangeBounds{
fn开始\u绑定(&self)->绑定{
包括(自启动)
}
fn结束\u绑定(&self)->绑定{
排除(self.end)
}
}
如您所见,
T
没有标记为
?size
,这会阻止我将
范围
传递到参数requires
impl RangeBounds


它背后是否有一些设计考虑?如果这是有意的,那么传递
[u8]
范围的正确方法是什么?

这是非常不幸的,但是添加
T:?Sized
绑定会中断代码中的类型推断,比如
btreemap.range(“from”。“.”to”)
,因为编译器无法在
T=str
T=&str
之间进行选择,它们都满足上的边界

关于这一点的一些讨论已在上一次会议上进行。据我所知,没有计划在将来放宽这些
impl
s的限制

您可以使用
绑定
的元组,而不是
范围
;例如,您可以编写以下内容,而不是
获取范围(“从“.”到“
”):

use std::ops::Bound;
takes_range((Bound::Included("from"), Bound::Excluded("to"))
这将起作用,因为
(绑定,绑定)
确实实现了
RangeBounds
,即使
T
!大小

use std::ops::Bound;
takes_range((Bound::Included("from"), Bound::Excluded("to"))