Rust中能否用12.ok()包装值,还是只能使用Ok(12)?
Rust中包装数值到Ok的写法问题
默认标准库环境下,
12.ok()这种写法不可行。标准库的ok()方法是Option类型的成员方法,作用是将Option<T>转换为Result<T, E>,而基础数值类型(比如i32)并没有自带这个方法来直接生成Ok(12)。Ok(12)是标准且推荐的写法,这是直接构造Result枚举的Ok变体,只要上下文能推断出对应的错误类型E(或者你显式指定),就能正常使用,比如:// 错误类型被推断为&str fn get_num() -> Result<i32, &str> { Ok(12) } // 显式指定错误类型为Box<dyn Error> let res: Result<i32, Box<dyn std::error::Error>> = Ok(12);如果你特别想用链式调用的风格,可以自己给数值类型实现自定义trait来扩展这个方法:
trait IntoOk { type Err; fn ok(self) -> Result<Self, Self::Err>; } // 以i32为例,指定错误类型为String impl IntoOk for i32 { type Err = String; fn ok(self) -> Result<Self, Self::Err> { Ok(self) } } // 此时就能用12.ok()了 let result = 12.ok(); // Result<i32, String>不过这种自定义写法属于非标准用法,除非有特定的代码风格需求,否则没必要多此一举,直接用
Ok(12)更符合社区惯例,可读性也更强。
内容的提问来源于stack exchange,提问作者Max Smirnov
相关产品推荐
相关产品推荐

