・「impl Trait」はトレイトメソッドの戻り値に指定できんのでBoxを使用する
・トレイト名の後ろでジェネリクスを指定
・Stringの場合、関数を作成する前にcloneを呼んでコピーを渡すと関数のライフタイムを考慮しなくてよい
trait MakeAddFn<T>{
fn make_add_fn(&self)-> Box<dyn Fn(T)->T>;
}
struct Qom {
p:String,
}
impl Qom{
pub fn new(q:String) -> Qom{
Qom{p:q}
}
}
impl MakeAddFn<String> for Qom {
fn make_add_fn(&self)-> Box<dyn Fn(String)->String>{
let temp = self.p.clone();
Box::new(move |r| format!("{}{}", temp, r))
}
}
struct Pom<'a> {
p:&'a i32,
}
impl Pom <'_>{
pub fn new(q:&i32) -> Pom{
Pom{p:q}
}
}
impl MakeAddFn<i32> for Pom<'_>{
fn make_add_fn(&self)-> Box<dyn Fn(i32)->i32> {
let p = *self.p;
Box::new(move |r| p + r)
}
}
fn main() {
let p = Pom::new(&8);
let add_fn = p.make_add_fn();
assert_eq!(15, add_fn(7));
println!("function result:{}", add_fn(10));
let q = Qom::new("トム".to_string());
let add_fn_s = q.make_add_fn();
println!("タイトルは\"{}\"", add_fn_s("とジェリー".to_string()));
}