Using`TryFrom`and`try_into()`provides several benefits and use cases over other approaches: useanyhow::{Result,anyhow,Context};usestd::path::PathBuf;usecrate::opts::Opts;#[derive(Debug)]pubstructConfig{puboperation:Operation,pubpwd:PathBuf,pubconfig:PathBuf,}implTryFrom<Opts>forConfig{typeError=...
} }fnmain(){letb: B = B;// From:通过 b 来创建 Aleta: A = A::from(b);// Into:将 b 转变为 A,还需指明类型Aleta: A = b.into(); } 此外,还有TryFrom和TryInto特性,都是实现类型转换,但是用于转换过程中可能出错的情况,其返回值为Result, 如impl TryFrom<B> for A,则有B → Result<...
try_into #[serde(try_into = "XXX")] 结构体、枚举将结构体序列化为XXX类型,impl TryFrom 或者 TryInto 特征。 from #[serde(from= "XXX")] 结构体、枚举 将结构体序列化为XXX类型,impl TryFrom 或者 TryInto 特征。(PS:和into类似,只要实现一个) try_from #[serde(try_from= "XXX")] 结构体...
如果简化一下,那么就是这个样子,我们需要实现 try_from 方法,并且要给某个类型起一个别名叫 Error。// TryFrom 和 TryInto 需要先导入 use std::TryFrom; use std::TryInto; #[derive(Debug)] struct IsAdult { age: u8 } impl TryFrom for IsAdult { type Error = &'static str; fn try_from(it...
}implTryFrom<&str>forMeasurement{typeError=String;fntry_from(s: &str)->Result<Measurement,String> {letvalue= s[0..s.len() -1].parse::();letunit= s.chars().last();match(value, unit) { (Ok(v),Some(u)) =>Ok(Measurement { value: v, unit: u }), _ =>Err...
既然impl From<T> for U之后可以自动获得impl Into<U> for T,那么我们自然应该优先实现From而不是Into了;仅仅当转换的一方不是当前crate的成员时,才应当考虑实现Into。最直观的例子就是我们可以为T实现Into<String>,但肯定不能为String实现From<T>,这违反了Rust的孤儿原则。
try_from是自反的,这意味着TryFrom<T> for T已实现并且不会失败 - 用于在T类型的值上调用T::try_from()的关联Error类型是Infallible。当!类型稳定时,Infallible和!将等效。 TryFrom<T>可以如下实现: usestd::convert::TryFrom;structGreaterThanZero(i32);implTryFrom<i32>forGreaterThanZero {typeError= &'...
impl TryFrom<i32> for EvenNumber { type Error = ();fn try_from(value: i32) -> Result<Self, Self::Error> { if value % 2 == 0 { Ok(EvenNumber(value)) } else { Err(()) } } }fn main() { // TryFromassert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8)));...
#[derive(Debug,PartialEq)]structEvenNumber(i32);impl TryFrom<i32>forEvenNumber{type Error=();fntry_from(value:i32)->Result<Self,Self::Error>{ifvalue%2==0{Ok(EvenNumber(value))}else{Err(())}}}// TryFromassert_eq!(EvenNumber::try_from(8),Ok(EvenNumber(8)));assert_eq!(EvenNumber...
From和FromStr是完全不同且完全无关的特征。 第一个执行1->1无效转换,而后者用于解析字符串(这是一个相当古老的特性,它的现代等价物是TryFrom,但因为FromStr与str::parse()挂钩,所以它仍然很方便和流行)。 在这里,您implFromStr,它对您的From::from调用没有任何作用。