rust - "cannot infer type for ` T `"使用错误枚举变体时

标签 rust

我有以下片段:

 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(())
}

在编译时会产生这个错误:

error[E0282]: type annotations needed
--> src/lib.rs:110:17
 |
 110 |             Err(PostalError::LibpostalSetup);
 |                 ^^^ cannot infer type for `T`

我已经尝试了很多事情:

  1. Err 添加类型注释,按照建议;例如Err::<(), PostalError>(PostalError::LibpostalSetup); ,它会编译但会产生警告和不正确的运行时行为(即单个 unwrap() 不再对返回的 Result 起作用)。

  2. 从单位类型更改 ()u8 (用于测试)。

  3. 通常以各种方式摆弄枚举变体签名更改,但无济于事。

奇怪的是,我在同一类型上还有另一个函数,与 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)
    }
}

编译器在前一个示例中到底遇到了什么问题?

我可以(并且可能)更改为 Option<PostalError> , 但这使得 match/unwrap/?使用起来很尴尬。如果可能的话,我宁愿不要。

最佳答案

 110 |             Err(PostalError::LibpostalSetup);
     |                 ^^^ cannot infer type for `T`

您错过了一个 return .

Err(PostalError::LibpostalSetup);是无用的语句,不是函数的返回值,所以我猜 Rust 是在说它无法推断 TResult<T, PostalError>你正在尝试构建。

Function Bodies Contain Statements and Expressions”解释了函数的返回值是如何确定的,“Are semicolons optional in Rust?”解释了 Rust 中分号或分号缺失的重要性。

关于rust - "cannot infer type for ` T `"使用错误枚举变体时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56942218/

相关文章:

rust - 在 Rust 中的堆上创建一个固定大小的数组

python - 在 Rust 中使用 python 的多处理库

rust - 搜索BST节点的Successor, "clone to satisfy borrow checker"灾难

rust - 在 Rust 中使用位数组的正确方法是什么?

rust - 从函数返回 `u32` 的数组/切片

rust - 我如何知道哪些语言可以编译为 ARMv7hl?

rust - Arcs 中的元组如何用引用解构?

sorting - 试图在不使用向量的情况下在 rust 中实现选择排序

rust - 将图像转换为字节,然后写入新文件

rust - 我如何将 stdout 输出到以 Rust 语言执行 std::process::Command 的终端