必须显示的初始化含有dyn triat的Box,这个代码是为结构AA装配XYZ特性,之后在某函数传入有XYZ特性的Box。
struct AA {
int1: i32,
int2: i32,
}
impl AA {
fn new(a: i32, b: i32) ->Self {
Self {
int1: a,
int2: b,
}
}
}
trait XYZ {
fn max(&mut self) -> (i32, i32);
fn CoDiv(&mut self) -> Option<i32>;
fn CoMul(&mut self) -> Option<i32>;
}
impl XYZ for AA {
fn max(&mut self) -> (i32, i32) {
if self.int1 > self.int2 {
return (self.int1,self.int2)
} else {
return (self.int2,self.int1)
}
}
fn CoDiv(&mut self) -> Option<i32> {
if self.int1 == 0 || self.int2 == 0{
return None;
}
let mut temp = 1;
let (mut ma, mut mi) = self.max();
loop{
temp = ma % mi;
if temp ==0 {break;}
ma = mi;
mi = temp;
}
Some(mi)
}
fn CoMul(&mut self) -> Option<i32> {
let temp = self.CoDiv()?;
Some(self.int1 * self.int2 / temp)
}
}
fn print_CoDiv(mut obj: Box<dyn XYZ>)
{
println!("{}", obj.CoMul().expect("..."));
}
fn main() {
let mut y = AA::new(9,12);
let num: Box<dyn XYZ> = Box::new(y);
print_CoDiv(num);
}
下面演示的是含闭包函数的Box,其中Box移入math后析构所以只能使用一次,如果要多次使用传入时加上clone()函数;Box<dyn Fn....>中F必须大写。
fn math(a: i32, b: i32, op: Box<dyn Fn(i32, i32) -> i32>) ->i32 {
op(a,b)
}
fn main() {
let add = Box::new(|a: i32, b: i32| a+b);
let sub = Box::new(|a: i32, b: i32| a-b);
println!("{}", math(3 ,4, sub));
}