やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのライフタイム4(impl定義)

 ライフタイム省略規則のときにサラッと流したので改めて。

成果物

参考

コード

fn main() {
    let s = S { field: "A" };
    println!("{}", s.method1("B"));
}
#[derive(Debug)]
struct S<'a> {
    field: &'a str,
}
impl<'a> S<'a> {
    fn level(&self) -> i32 { 3 }
    fn get_field(&self) -> &str { self.field }
    fn method1(&self, p1: &str) -> &str {
        println!("{}", p1);
        self.field
    }
}

 impl<'a> S<'a> {}のように定義する。

ライフタイム省略について

 構造体のフィールドに参照をもちいるとき、ライフタイム注釈によりライフタイムを明示する必要がある。それはimplによる実装にも波及する。impl定義の<'a>は省略できない。構造体Sの型がS<'a>でありライフタイムを含んでいるため。構造体S<'a>も同様。これを消せば参照であるfieldのライフタイムが不明となりコンパイルエラーになる。

 参照であるfieldを返すメソッドmethod1の戻り値は&str型である。ライフタイム省略規則により、引数や戻り値のライフタイム注釈は省略できる。詳細は前回

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで