当前位置: 首页 > 知识库问答 >
问题:

为什么编译器需要这个特性提示?

花高爽
2023-03-14

我有这个密码:

pub trait MiddlewareHandler: Clone + Send {
    //...probably unimportant for the question
}

#[deriving(Clone)]
pub struct Middleware {
    handlers: Vec<Box<MiddlewareHandler>>
}

#[deriving(Clone)]
pub struct Server{
    middleware: Middleware
}

这给我留下了编译器对我大喊大叫:

src/server.rs:20:31: 20:37 error: the type `server::Server', which does not fulfill `Send`, cannot implement this trait
src/server.rs:20 impl http::server::Server for Server {
                                           ^~~~~~
src/server.rs:20:31: 20:37 note: types implementing this trait must fulfill `Send+Sized`
src/server.rs:20 impl http::server::Server for Server {

我花了很长时间才明白我必须改变Vec

pub trait MiddlewareHandler: Clone + Send {
    //...probably unimportant for the question
}

#[deriving(Clone)]
pub struct Middleware {
    handlers: Vec<Box<MiddlewareHandler + Send>>
}

#[deriving(Clone)]
pub struct Server{
    middleware: Middleware
}

代码现在编译,但我完全不明白这里到底有什么问题。为什么要在Vec定义中发送代码?我的意思是,这个特性已经实现了发送克隆。对我来说,这看起来相当多余。

有人能和我分享他的智慧吗,为什么我必须这样修改代码?

共有1个答案

轩辕经赋
2023-03-14

看起来像个虫子,我提交了15155号文件。

“问题”是http::server::server上的Send限制。定义是

pub trait Server: Send + Clone {

这意味着实现者需要同时是Clone(这是满足的,因为您已经通过#[派生(克隆)]实现了Clone)和发送。编译器自动实现的发送的类型的内容满足发送(这个细节将改变与选择内置特性:他们将需要显式实现太),不幸的是,原始类型是类似

pub struct Middleware {
    handlers: Vec<Box<Trait>>
}

通常不实现Send:编译器无法知道框中已擦除的类型

编译器需要知道更多信息,也就是说,它需要保证内部类型是Send,这可以通过向trait对象:添加更多边界来提供

然而,在本例中,MiddlewareHandlertrait已经将这个Send绑定为一个超级trait(这意味着trait对象的内容必须满足Send),因此编译器没有计算出这个框是很奇怪的

 类似资料:
  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 我无法理解以下科特林文档: 为什么编译器在这里需要显式初始值设定项的唯一解释(至少我能想到的唯一解释)是 Kotlin 没有属性的默认值。对吗?如果是,为什么?换句话说:Kotlin 属性和 Java 字段(具有默认值)之间有什么区别,这不允许我们有属性的默认值?

  • 说明: 这实际上是一个诡计问题,因为这段代码不会编译!正如您在第1章中所记得的,浮点文字被假定为双倍,除非后缀有一个f,如2.1f。如果正确地将该值设置为2.1F,那么升级将与上一个示例类似,两个操作数都升级为double,结果将是一个double值。 但我不明白。如果浮动y=2.1;假设是双倍,则不需要将变量y提升到双倍。而我更困惑的是下一个问题,那就是:

  • 奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。

  • 本文向大家介绍什么是预编译,何时需要预编译:相关面试题,主要包含被问及什么是预编译,何时需要预编译:时的应答技巧和注意事项,需要的朋友参考一下 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法: