本文简要介绍rust语言中 Trait core::convert::TryFrom
的用法。
用法
pub trait TryFrom<T>: Sized {
type Error;
fn try_from(value: T) -> Result<Self, Self::Error>;
}
在某些情况下,可能会以受控方式失败的简单且安全的类型转换。它是 TryInto
的倒数。
当您正在进行可能会成功但也可能需要特殊处理的类型转换时,这非常有用。例如,无法使用 From
特征将 i64
转换为 i32
,因为 i64
可能包含 i32
无法表示的值,因此转换会丢失数据。这可以通过将 i64
截断为 i32
(本质上是给 i64
的值模 i32::MAX
)或简单地返回 i32::MAX
或通过某种其他方法来处理。 From
特性旨在实现完美转换,因此 TryFrom
特性会在类型转换可能出错时通知程序员,并让他们决定如何处理它。
通用实现
TryFrom<T> for U
暗示TryInto
<U> for T
-
try_from
是自反的,这意味着TryFrom<T> for T
已实现并且不会失败 - 用于在T
类型的值上调用T::try_from()
的关联Error
类型是Infallible
。当!
类型稳定时,Infallible
和!
将等效。
TryFrom<T>
可以如下实现:
use std::convert::TryFrom;
struct GreaterThanZero(i32);
impl TryFrom<i32> for GreaterThanZero {
type Error = &'static str;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value <= 0 {
Err("GreaterThanZero only accepts value superior than zero!")
} else {
Ok(GreaterThanZero(value))
}
}
}
例子
use std::convert::TryFrom;
let big_number = 1_000_000_000_000i64;
// Silently truncates `big_number`, requires detecting
// and handling the truncation after the fact.
let smaller_number = big_number as i32;
assert_eq!(smaller_number, -727379968);
// Returns an error because `big_number` is too big to
// fit in an `i32`.
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());
// Returns `Ok(3)`.
let try_successful_smaller_number = i32::try_from(3);
assert!(try_successful_smaller_number.is_ok());
相关用法
- Rust TryIter用法及代码示例
- Rust Try.from_output用法及代码示例
- Rust Try用法及代码示例
- Rust Try.branch用法及代码示例
- Rust TcpStream.local_addr用法及代码示例
- Rust TcpStream.peer_addr用法及代码示例
- Rust TcpListener.take_error用法及代码示例
- Rust Take.limit用法及代码示例
- Rust TcpStream.set_nodelay用法及代码示例
- Rust ToSocketAddrs用法及代码示例
- Rust TcpStream.nodelay用法及代码示例
- Rust ToOwned.to_owned用法及代码示例
- Rust TcpListener.into_incoming用法及代码示例
- Rust TcpStream.take_error用法及代码示例
- Rust TcpListener.accept用法及代码示例
- Rust ThreadId用法及代码示例
- Rust Take.set_limit用法及代码示例
- Rust Thread.unpark用法及代码示例
- Rust TcpStream.write_timeout用法及代码示例
- Rust TcpListener.local_addr用法及代码示例
- Rust Take.get_ref用法及代码示例
- Rust TcpStream.peek用法及代码示例
- Rust TcpStream.set_write_timeout用法及代码示例
- Rust TcpListener.ttl用法及代码示例
- Rust TcpStream.set_nonblocking用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait core::convert::TryFrom。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。