やってみる

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

Rustのライフタイム6(ジェネリクス、トレイト境界とともに)

 非常に見づらいコードになった。

成果物

コード

fn main() {
    println!("{}", my_fn("A", "BB", "C"));
}
fn my_fn<'a, T>(p1: &'a str, p2: &'a str, p3: T) -> &'a str
    where T: std::fmt::Display
{
    println!("{}", p3);
    if p1.len() > p2.len() { p1 }
    else { p2 }
}

所感

 Rustのコードってこんな見づらくなるのか。ジェネリクス<>where句が冗長。根本的には&(参照), 'a(ライフタイム)のせい。

 特にライフタイムは何とか自動でうまいことやってほしい。戻り値のライフタイムが最低でも引数とおなじ長さであり関数内で終了しないこと、なんていうのは当然の要求だと思うのだが。ライフタイム指定子で指定してやらないとマズイの? 参照引数が1つでなく複数のときでも省略して書けるようにしたらダメなの?

 以下くらい簡単に書きたいのだが。

fn my_fn(p1: &str, p2: &str, p3: T) -> &str

 もっといえば以下が理想。

str my_fn(str p1, str p2, T p3)

対象環境

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

前回まで