Rust needs a safe abstraction over uninitialized memory

I think, in general, I need 2 types. I am not sure these are good names.

let (a,b):('a Undefined<i64>, 'b Uninit<i64>)=get_uninit<i64>();
//creates 2 lifetimes, and 2 types. 
set(b,5); //consumes b. This ends the lifetime 'b
let c:i64=a.is_init(); //function is only valid once lifetime of 'b has ended. 
// this consumes a.
//The only variable now in scope is c, which equals 5.