[Solved] Is 'static okay?


I have a struct that contains Cow:

struct Subject<'a> {
    inner: Cow<'a, str>

If a method returns an Owned variant, is it okay to specify the 'static lifetime? Or, more specifically, will the instance not live to the end of time?

pub fn from_string(s: String) -> Result<Subject<'static>, SubjectError> {
    Ok(Subject { inner: Cow::Owned(s) })

Full code here (Rust Playground).


Yes. An owned Cow doesn’t depend on any other data, so it can be kept alive as long as the caller wants.


Variance should also allow someone to take that Subject<'static> and use it as any Subject<'a> they want.


Note that Box::leak returns a &mut 'a T, not a &mut 'static T, so it’s possible it should be

pub fn from_string(s: String) -> Result<Subject<'a>, SubjectError>

(I don’t really know what the implications are for it.)


I don’t know why Box::leak needs to do that – according to the nomicon on Variance, "&'a mut T is covariant over 'a but invariant over T", so I’d expect it could have just returned &'static mut T. I suppose that signature does let you call Box::leak::<'a>(b) without otherwise casting or coercing the lifetime.

edit: Oh, because it also requires T: 'a to make a legal reference, so it’s more flexible this way than requiring T: 'static. This isn’t an issue for the Subject given here, but could be something to consider if it had other generic parameters.


Aha! Silly thing, somehow I haven’t even tried this variant.