作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个结构定义,其中包括此字段:
pub struct Separated<'a, I, T>
{
..., // other fields,
separated: NonNull<dyn 'a + Iterator<Item = T>>,
}
let sep = Separated {
..., // other fields
separated: NonNull::dangling(),
};
error[E0282]: type annotations needed
|
16 | separated: NonNull::dangling(),
| ^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
use std::pin::Pin;
use std::ptr::NonNull;
pub struct Separated<'a, T> {
t: &'a T,
separated: NonNull<dyn 'a + Iterator<Item = T>>,
}
impl<'a, T> Separated<'a, T>
where
T: 'a + Copy + PartialEq,
{
fn new(t: &'a T) -> Pin<Box<Self>> {
let sep = Separated {
t,
separated: NonNull::dangling(),
};
unimplemented!()
}
}
separated
作为指向 trait 对象而不是单态类型的指针:它将包含的真正 trait 对象由一堆迭代器组合器组成,包括像
Map
和
TakeWhile
这样的组合器,它们的类型包括函数指针,因此是无名。
NonNull::dangling
不是参数函数:
NonNull<T>
结构是参数的,但这个函数不是。因此,我不能只是想方设法摆脱困境。我完全不确定如何提供类型注释。
IntoChunks
组合器生成的
chunks()
结构本身并不是一个迭代器,只是一个实现
IntoIterator
的结构。因此,我们需要跟踪
IntoChunks
结构以及它产生的迭代器。
Separated
,其中包含这两者。假设结构总是固定的,这应该是安全的。然后我
impl Iterator for Separated
并将
next
调用推迟到
self.separated
。
最佳答案
根据标准文档, NonNull::dangling()
的定义这是:
impl<T> NonNull<T> {
pub const fn dangling() -> NonNull<T> {
/* ... */
}
}
NonNull<dyn 'a + Iterator<Item = T>>
的表达式中使用它。 ,所以返回值必须是这个类型。
Sized
绑定(bind)(除非它有
?Sized
绑定(bind))。所以因为执行
NonNull::dangling
没有
?Sized
绑定(bind),Rust 将尝试推断
NonNull
的类型参数基于这些要求:
NonNull::<T>::dangling()
方法没有界限 T: ?Sized
, 它仅适用于大小类型 T
,并且必须调整类型参数的大小。 dyn 'a + Iterator<Item = T>
. dyn Trait
类型”)没有大小,Rust 不可能同时满足这两个要求,因此它“无法推断类型参数
T
的类型”。
let sep = Separated::<'a, T> {
t,
separated: NonNull::<dyn 'a + Iterator<Item = T>>::dangling(),
};
error[E0599]: no function or associated item named `dangling` found for type `std::ptr::NonNull<(dyn std::iter::Iterator<Item = T> + 'a)>` in the current scope
--> src/lib.rs:16:64
|
16 | separated: NonNull::<dyn 'a + Iterator<Item = T>>::dangling(),
| ^^^^^^^^ function or associated item not found in `std::ptr::NonNull<(dyn std::iter::Iterator<Item = T> + 'a)>`
|
= note: the method `dangling` exists but the following trait bounds were not satisfied:
`dyn std::iter::Iterator<Item = T> : std::marker::Sized`
关于pointers - 当类型在结构定义中明确指定时,无法推断类型参数 T 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60469553/
我是一名优秀的程序员,十分优秀!