本文簡要介紹rust語言中 Trait std::convert::TryFrom
的用法。
用法
pub trait TryFrom<T> {
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 TryFrom用法及代碼示例
- 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-lang.org大神的英文原創作品 Trait std::convert::TryFrom。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。