gpt4 book ai didi

generics - Rust 期望生成器有两个级别的装箱,而我只指定了一个

转载 作者:行者123 更新时间:2023-11-29 08:25:02 26 4
gpt4 key购买 nike

我认为应该工作的东西遇到编译器错误。

我试过了 this code (在撰写本文时,音符生成器仅在夜间提供):

#![feature(generators, generator_trait)]

use std::ops::Generator;

struct Value {}

struct Container<G: Generator<Yield = Value, Return = ()>> {
generator: Box<G>,
}

impl Container<Box<Generator<Yield = Value, Return = ()>>> {
pub fn new(&mut self) -> Box<Self> {
let generator: Box<Generator<Yield = Value, Return = ()>> = Box::new(|| loop {
yield Value {}
});
Box::new(Container {
generator: generator,
})
}
}

fn main() {}

我在哪里得到这个错误:

error[E0308]: mismatched types
--> src/main.rs:20:24
|
20 | generator: generator,
| ^^^^^^^^^ expected struct `std::boxed::Box`, found trait std::ops::Generator
|
= note: expected type `std::boxed::Box<std::boxed::Box<std::ops::Generator<Yield=Value, Return=()>>>`
found type `std::boxed::Box<std::ops::Generator<Yield=Value, Return=()>>`

error: aborting due to previous error

我不明白为什么这里需要两层装箱,我只要求一层 ( Box<G> )。

看起来像Generator确实是一个特征,而不是 Box<...> 的别名.我想不出其他解释。

我可以通过替换 Box<G> 轻松解决错误通过 G ,但我想知道为什么我的方法不起作用(可能是错误?)。

Nightly 版本 1.28.0-nightly (2018-06-15 967c1f3be1c9ce0469ae) 在 playground 上处于 Debug模式(但我在本地有一个类似的问题,代码更复杂)。

最佳答案

这里有几个问题。

首先,您定义Containter<G>作为具有 Box<G> 类型的成员.然后你写impl对于 Containter<Box<G>> , 那自然有一个 Box<Box<G>> 类型的成员.可能你只是想要:

impl Container<Generator<Yield = Value, Return = ()>> {
...
}

其次,如果你再次编译你有这个错误:

|

16 |         Box::new(Container {
| ^^^^^^^^^ `std::ops::Generator<Yield=Value, Return=()>` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `std::ops::Generator<Yield=Value, Return=()>`
note: required by `Container`
--> a.rs:7:1
|
7 | struct Container<G: Generator<Yield = Value, Return = ()>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这意味着struct Containter要求 G大小,但你的生成器没有实现它。没错,你想要Box<G>成为特征对象,所以 G将未调整大小(特征类型)。但是结构中的类型参数是 Sized默认情况下。解决方案是添加?SizedContainer 的要求:

struct Container<G: Generator<Yield = Value, Return = ()> + ?Sized> {
generator: Box<G>,
}

现在它可以编译了。

附言:如果您的 Container struct 只能与 Generator 一起使用特征对象摆脱通用参数并只写:

struct Container {
generator: Box<Generator<Yield = Value, Return = ()>>,
}

impl Container {
pub fn new(&mut self) -> Box<Self> {
let generator = Box::new(|| loop {
yield Value {}
});
Box::new(Container {
generator: generator,
})
}
}

关于generics - Rust 期望生成器有两个级别的装箱,而我只指定了一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com