Genericで使われるstatic lifetimeとは

static lifetimeは、オブジェクトがどのような寿命よりも長持ちするかを定義する。

必ずしも、プログラムが終了したときにだけ削除されるとは限りません。ただ、このオブジェクトが他のどのオブジェクトよりも先にスコープ外に出ることを、Rust が強制する必要がないことを意味しているのです。

例えば、&'static strは'static lifetimeを持ちますが、i64やStringも同じです。そのため、次のような関数 。

fn take<T : Clone + 'static>(t : T);

は文字列と整数を引数として持つことができます。

静的リソースは他のリソースより先に破壊される必要がなく、必要なだけ生き続けることができるのです。一方、'a リソースには寿命があり、親がスコープ外に出る前に破棄されなければならない。

しかし、私たちは並行処理をしています。つまり、あるスレッドの何かが他のスレッドの何かより先に実行されることは保証できないので、あるスレッドのオブジェクトが他のスレッドのオブジェクトがスコープ外に出る前に破壊されることは約束できない。

したがって、オブジェクトを他のスレッドに送るには、そのオブジェクトがそれ自体で生きていけることを要求するのが最も安全な選択です。