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
(用于测试)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分支是函数的结尾有关。所以编译器可以推断出我的意图;请查看并感谢这些链接,请随意转载您的评论,作为您被接受的答案。