Compiler errors 从方法内部的模式匹配返回时,在当前作用域中找不到关联类型

Compiler errors 从方法内部的模式匹配返回时,在当前作用域中找不到关联类型,compiler-errors,rust,pattern-matching,associated-types,Compiler Errors,Rust,Pattern Matching,Associated Types,我有: 当我明确地写它时,就像这样: match connection_result { Ok(c) => Ok(MSSQLConnection(c)), Err(e) => Err(MSSQLConnectionManagerError(Errors::TiberiusError(e))), } 现在它编译成功了。 如果我尝试使用L10,返回Err(Self::error(e)),我确实会得到相同的编译器错误 为什么这不能像我预期的那样起作用呢?这里有一个简单的例

我有:

当我明确地写它时,就像这样:

match connection_result {
    Ok(c) => Ok(MSSQLConnection(c)),
    Err(e) => Err(MSSQLConnectionManagerError(Errors::TiberiusError(e))),
}
现在它编译成功了。 如果我尝试使用L10,返回
Err(Self::error(e))
,我确实会得到相同的编译器错误


为什么这不能像我预期的那样起作用呢?

这里有一个简单的例子重现了同样的问题。为清晰起见,更改了一些类型名称

trait Manager {
    type Connection;

    fn connect(&self) -> Self::Connection;
}

pub struct ConnectionId(usize);

pub struct FooManager;

impl Manager for FooManager {
    type Connection = ConnectionId;

    fn connect(&self) -> Self::Connection {
        Self::Connection(5)
    }
}
尝试使用关联的类型
连接
作为具体类型
连接ID
的别名时会出现错误,具体类型由
管理器
的实现定义。但是,关联类型的行为并不完全像类型别名。即使我们可以构造一个
连接ID
(因为它是一个元组结构,并且我们可以在这个模块中看到它的成员),我们也不能通过关联的类型
Self::Connection
来实现。我们可以做的是访问由其约束定义的其他符号。例如,如果我们有:

trait Manager {
    type Connection: Default;
    // ...
}
我们可以从
Self::Connection
调用
default


因此,将原始示例中的表达式
Ok(Self::Connection(c))
更改为
Ok(MSSQLConnection(c)),
是解决此问题的正确方法。如果在此步骤中还需要抽象类型,则可以将关联的类型约束为新的特征,提供必要的构造方法。

请查看如何创建一个特征,然后查看您的问题以将其包含在内。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。也有。是的,我很抱歉。我一直在挠头,试图找出我的代码为什么不能编译的线索,但当我再也受不了的时候,我就迫不及待了。你提供的代码由于语法错误而不能编译。在发布之前,请自己在本地尝试一下,以确保它产生的错误与您最初遇到的错误相同。从一开始就花时间写一个好问题是非常值得的。虽然我们知道你可能已经被这个问题困扰了一段时间,但匆忙提出这个问题是最值得避免的事情之一。话虽如此,该错误消息似乎只是试图在实现类型
MSSQLConnectionManager
中查找关联类型
Connect
,而不是实现的trait
ConnectionManager
。将
Ok(Self::Connection(c))
替换为
Ok(::Connection(c))
是否有帮助?关于您的项目,可能需要指定更多的内容:记住Rust编译器版本和Cargo.lock。我们并不是在暗示你在撒谎,但如果我们抓住了你提供的代码,而我们无法重现问题,我们别无选择,只能说问题中缺少一个变量。因此,不支持通过类型别名构造。既然我理解了这个问题,我就用谷歌搜索:
不能使用类型别名[…]来限定构造函数。因此,类型别名只能帮助缩短类型定义,就像那些具有多个有界类型的定义一样,从而产生更简洁的类型名。因此,它们只能用于定义变量类型、函数返回类型或参数类型。谢谢你帮助我理解这一点。@Paul,在我看来,这是正确的。关键是类型别名和关联类型的行为不同,尽管它们在语法上彼此相似。但它们有我列出的相同限制,对吗?@brokenthorn是的,这是一个常见的限制。
trait Manager {
    type Connection: Default;
    // ...
}