Rust &引用;无法推断“T”的类型;使用错误枚举变量时

Rust &引用;无法推断“T”的类型;使用错误枚举变量时,rust,Rust,我得到了以下片段: pub fn init(&mut self, opts: InitOptions) -> Result<(), PostalError> { let _ = self.mutex.lock(); unsafe { if !libpostal_setup() { Err(PostalError::LibpostalSetup); } } self.setup_do

我得到了以下片段:

 pub fn init(&mut self, opts: InitOptions) -> Result<(), PostalError> {
    let _ = self.mutex.lock();
    unsafe {
        if !libpostal_setup() {
            Err(PostalError::LibpostalSetup);
        }
    }
    self.setup_done = true;
    if opts.expand_address {
        unsafe {
            if !libpostal_setup_language_classifier() {
                Err(PostalError::LibpostalEnableExpansion);
            }
        }
        self.expand_address_enabled = true;
    }
    Ok(())
}
我尝试了很多方法:

  • 根据建议,将类型注释添加到
    Err
    ;e、 g.
    Err::(PostalError::LibpostalSetup),它编译但产生警告和错误的运行时行为(即单个
    展开()
    不再对返回的
    结果起作用)

  • 从单元类型
    ()
    更改为
    u8
    (用于测试)

  • 通常以各种方式摆弄enum变体签名的更改,但毫无用处

  • 奇怪的是,我在同一类型上有另一个函数,使用了类似的
    Result
    ,编译器对此没有问题:

    pub fn expand_address(
        &self,
        a: &str,
        opts: ExpandAddressOptions,
    ) -> Result<Expansions, PostalError> {
        if self.setup_done && self.expand_address_enabled {
            let _ = self.mutex.lock();
            unsafe {
                match CString::new(a) {
                    Ok(c_string) => {
                        let addr = c_string.as_ptr() as *mut c_char;
    
                        let mut num_expansions: usize = 0;
                        let raw = libpostal_expand_address(addr, opts.opts, &mut num_expansions);
                        Ok(Expansions::new(raw, num_expansions))
                    }
                    Err(e) => Err(PostalError::BadCString(e)),
                }
            }
        } else {
            Err(PostalError::LibpostalNotReady)
        }
    }
    
    发布fn扩展地址(
    &自我,
    a:&str,
    选项:扩展地址选项,
    )->结果{
    如果self.setup\u完成&&self.expand\u address\u启用{
    让ux=self.mutex.lock();
    不安全{
    匹配CString::新(a){
    Ok(c_字符串)=>{
    让addr=c_string.as_ptr()as*mut c_char;
    让mut num_展开:usize=0;
    设raw=libpostal\u expand\u address(addr、opts.opts和mut num\u expansions);
    Ok(扩展::新建(原始、num_扩展))
    }
    Err(e)=>Err(PostalError::BadCString(e)),
    }
    }
    }否则{
    错误(PostalError::LibpostalNotReady)
    }
    }
    
    在前一个例子中,编译器到底有什么问题

    我可以(也可能)更改为
    选项
    ,但这使得
    匹配
    /
    展开
    /
    难以使用。如果可能的话,我宁愿不要

     110 |             Err(PostalError::LibpostalSetup);
         |                 ^^^ cannot infer type for `T`
    
    您错过了一个
    返回

    Err(PostalError::LibpostalSetup)
    是一个无用的语句,不是函数的返回值,所以我猜Rust是说它无法在您试图构造的
    结果中推断
    T

    “”说明如何确定函数的返回值,“”说明分号在Rust中的重要性或缺少分号

    您错过了一个
    返回

    Err(PostalError::LibpostalSetup)
    是一个无用的语句,不是函数的返回值,所以我猜Rust是说它无法在您试图构造的
    结果中推断
    T


    “”说明如何确定函数的返回值,“”说明分号在Rust中的重要性或缺少分号。

    您错过了一个
    返回值
    Err(PostalError::LibpostalEnableExpansion)
    是一个(无用的)语句,不是函数的返回值,所以我猜Rust是说它无法在您试图构造的
    结果中推断
    T
    。有趣的是,我实际上还没有使用
    return
    。知道为什么在第二个示例中它似乎乐于接受
    Err(PostalError::LibpostalNotReady)
    吗?我猜这与它是匹配臂中的最后一个案例以及else分支是函数的结尾有关。所以编译器可以推断出我的意图;请查看并感谢链接,请随意转载您的评论,作为您被接受的答案。您错过了一个
    返回
    Err(PostalError::LibpostalEnableExpansion)
    是一个(无用的)语句,不是函数的返回值,所以我猜Rust是说它无法在您试图构造的
    结果中推断
    T
    。有趣的是,我实际上还没有使用
    return
    。知道为什么在第二个示例中它似乎乐于接受
    Err(PostalError::LibpostalNotReady)
    吗?我猜这与它是匹配臂中的最后一个案例以及else分支是函数的结尾有关。所以编译器可以推断出我的意图;请查看并感谢这些链接,请随意转载您的评论,作为您被接受的答案。