usestd::convert::From;#[derive(Debug)]structNumber{
value:i32,}implFrom<i32>forNumber{fnfrom(item:i32)->Self{Number{ value: item }}}fnmain(){let num =Number::from(30);println!("My number is {:?}", num);}
如果实现了自己的from,就可以使用Into进行反作用:
usestd::convert::From;#[derive(Debug)]structNumber{
value:i32,}implFrom<i32>forNumber{fnfrom(item:i32)->Self{Number{ value: item }}}fnmain(){let int =5;// 试试删除类型说明let num:Number= int.into();println!("My number is {:?}", num);}
注意Into必须指明要转换的类型,如去掉num的说明类型:
Compiling playground v0.0.1(/playground)
error[E0282]:typeannotations needed
--> src/main.rs:17:9|17|let num = int.into();|^^^|
help: consider giving `num` an explicit type|17|let num: _ = int.into();|+++For more information about this error,try `rustc --explain E0282`.
error: could not compile `playground` due to previous error
TryFrom和TryInto
类似于From和Into,TryFrom返回值是Result,因此,它的作用是更加容易出错的转换:
usestd::convert::TryFrom;usestd::convert::TryInto;#[derive(Debug, PartialEq)]structEvenNumber(i32);implTryFrom<i32>forEvenNumber{typeError=();fntry_from(value:i32)->Result<Self,Self::Error>{if value %2==0{Ok(EvenNumber(value))}else{Err(())}}}fnmain(){// TryFromassert_eq!(EvenNumber::try_from(8),Ok(EvenNumber(8)));assert_eq!(EvenNumber::try_from(5),Err(()));// TryIntolet result:Result<EvenNumber,()>=8i32.try_into();assert_eq!(result,Ok(EvenNumber(8)));let result:Result<EvenNumber,()>=5i32.try_into();assert_eq!(result,Err(()));}