LoginSignup
5
3

More than 3 years have passed since last update.

Rustで関数を返却するメソッドをトレイトに分離して戻り値の型をi32でもStringでも使えるようにしたい

Last updated at Posted at 2020-01-15

・「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()));
}

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3