我有以下片段:
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`
我已经尝试了很多事情:
向
Err
添加类型注释,按照建议;例如Err::<(), PostalError>(PostalError::LibpostalSetup);
,它会编译但会产生警告和不正确的运行时行为(即单个unwrap()
不再对返回的Result
起作用)。从单位类型更改
()
至u8
(用于测试)。通常以各种方式摆弄枚举变体签名更改,但无济于事。
奇怪的是,我在同一类型上还有另一个函数,与 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 是在说它无法推断 T
在Result<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/