Generics 为什么此类型上不允许使用类型参数?
试图编译以下内容Generics 为什么此类型上不允许使用类型参数?,generics,macros,rust,type-inference,Generics,Macros,Rust,Type Inference,试图编译以下内容 fn do_it() -> Result<i32, u32> { Result::<i32, u32>::Ok(3) } fn main() { println!("{}", do_it()); } ) 注意:下面回答了为什么不允许使用类型参数的问题。事实证明,这并不是“无法推断足够的类型信息”的原因。(read_func是一个函数,在我的例子中,我传递的是一个模板函数,但忘记了无法推断的模板arg。)这实际上与枚举不一致,但
fn do_it() -> Result<i32, u32> {
Result::<i32, u32>::Ok(3)
}
fn main() {
println!("{}", do_it());
}
)
注意:下面回答了为什么不允许使用类型参数的问题。事实证明,这并不是“无法推断足够的类型信息”的原因。(
read_func
是一个函数,在我的例子中,我传递的是一个模板函数,但忘记了无法推断的模板arg。)这实际上与枚举不一致,但认为其重要性不足以阻止1.0
指定类型的工作语法是Result::Ok::(3)
枚举的工作方式类似于类型(与您试图编写的语法相一致)和命名空间(命名空间不接受类型参数)之间的工作方式
要演示枚举与名称空间的相似性,可以编写:
use std::result::Result::*;
fn main() {
println!("{:?}", Ok::<i32, u32>(3));
}
使用std::result::result::*;
fn main(){
println!(“{:?}”,Ok::(3));
}
这种名称空间特性是枚举的理想特性,但将类型参数移动到人们直觉上认为应该移动的位置会使这种代码编写起来非常困难。在我看来,这非常像一个bug。显示它应该执行的操作。作为解决实际问题的方法,我建议将您的宏更改为
$reader.$read\u func().map\u err(LocalReadError::from)
不确定这是否是一个错误,或者这是否是实际需要的,但有效的语法似乎是:结果::确定::(3)
。
match $reader.$read_func() {
Ok(n) => Result::<$read_type, LocalReadError>::Ok(n),
Err(err) => Result::<$read_type, LocalReadError>::Err(
LocalReadError::from(err)
),
}
error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
match $reader.$read_func() {
^~~~~~~~~~~~
use std::result::Result::*;
fn main() {
println!("{:?}", Ok::<i32, u32>(3));
}