fnaverage(values:&[f64])->f64{let total = values.iter().sum::<f64>();total / values.len()asf64}
只有一些标准库的特定类型可以用as
可能会丢失精度,因为会截断
From
implFrom<&str>forPerson{fnfrom(s:&str)->Person{let parts = s.split(',').collect::<Vec<&str>>();if parts.len()!=2{returnSelf::default();}if parts[0]==""{returnSelf::default();}ifletErr(_)= parts[1].parse::<usize>(){returnSelf::default();}Person{ name : parts[0].to_string(), age : parts[1].parse::<usize>().unwrap()}}}
只能返回Self,无法进行错误处理
上文如果发现非法字符只能返回默认选项
FromStr
implFromStrforPerson{typeErr=ParsePersonError;fnfrom_str(s:&str)->Result<Person,Self::Err>{if s.len()==0{returnErr(ParsePersonError::Empty);}let parts = s.split(',').collect::<Vec<&str>>();if parts.len()!=2{returnErr(ParsePersonError::BadLen);}if parts[0]==""{returnErr(ParsePersonError::NoName);}ifletErr(x)= parts[1].parse::<usize>(){returnErr(ParsePersonError::ParseInt(x));}Ok(Person{ name : parts[0].to_string(), age : parts[1].parse::<usize>().unwrap()})}}
特指字符串转换为其它类型
实现后可以调用parse< T >()方法,用于将字符串转换为指定类型
TryFrom
implTryFrom<(i16,i16,i16)>forColor{typeError=IntoColorError;fntry_from(tuple:(i16,i16,i16))->Result<Self,Self::Error>{if tuple.0>255|| tuple.0<0|| tuple.1>255|| tuple.1<1|| tuple.2>255|| tuple.2<1{returnErr(Self::Error::IntConversion);}Ok(Self{red : tuple.0asu8, green : tuple.1asu8, blue : tuple.2asu8})}}// Array implementationimplTryFrom<[i16;3]>forColor{typeError=IntoColorError;fntry_from(arr:[i16;3])->Result<Self,Self::Error>{letmut p =0;for x in arr.iter(){if*x >255||*x <1{returnErr(Self::Error::IntConversion);}p +=1;}if p !=3{returnErr(Self::Error::BadLen);}Ok(Self{red : arr[0]asu8, green : arr[1]asu8, blue : arr[2]asu8})}}// Slice implementationimplTryFrom<&[i16]>forColor{typeError=IntoColorError;fntry_from(slice:&[i16])->Result<Self,Self::Error>{if slice.len()!=3{returnErr(Self::Error::BadLen);}for x in slice.iter(){if*x >255||*x <1{returnErr(Self::Error::IntConversion);}}Ok(Self{red : slice[0]asu8, green : slice[1]asu8, blue : slice[2]asu8})}}
fnbyte_counter<T:AsRef<str>>(arg:T)->usize{arg.as_ref().as_bytes().len()}// Obtain the number of characters (not bytes) in the given argument.// TODO: Add the AsRef trait appropriately as a trait bound.fnchar_counter<T:AsRef<str>>(arg:T)->usize{arg.as_ref().chars().count()}// Squares a number using as_mut().// TODO: Add the appropriate trait bound.fnnum_sq<T:AsMut<u32>>(arg:&mutT){// TODO: Implement the function body.letmut x = arg.as_mut();*x *=*x;}