Define a characteristic with a function that returns a related type with the same lifetime as one parameter

I am trying to define an attribute with a function that returns a related type with the same lifetime as one parameter.

Conceptually, something like the following (which doesn't work:) lifetime parameter not allowed on this type [Self::Output]:

trait Trait {
    type Output;
    fn get_output<'a>(&self, input: &'a i32) -> Self::Output<'a>;
}

I found a few questions about life spans for related types in Qaru and the web, but none of them help. Some suggested determining life expectancy by all indications:

trait Trait<'a> {
    type Output;
    fn get_output(&self, input: &'a i32) -> Self::Output;
}

but that won't work either: it compiles, but then the following function fails to compile:

fn f<'a, T>(var: &T)
    where T: Trait<'a>
{
    let input = 0i32;
    let output = var.get_output(&input);
}

with an error:

error: `input` does not live long enough
  --> <anon>:9:35
   |
   |     let output = var.get_output( &input );
   |                                   ^^^^^ does not live long enough
   | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the body at 7:48...
  --> <anon>:7:49
   |
   |   fn f<'a, T>( var : &T ) where T : Trait<'a> {
   |  _________________________________________________^ starting here...
   | |     let input = 0i32;
   | |     let output = var.get_output( &input );
   | | }
   | |_^ ...ending here

How to define a trait so that it behaves the way I want?

+4
source share
2 answers

, .

(HKT), , , (ATC).

.

ATC :

trait Trait {
    type Output<'a>;
    fn get_output<'a>(&self, input: &'a i32) -> Self::Output<'a>;
}

: ATC, . Niko.


HRTB ( ), Shepmaster:

fn f<T>(var: &T)
    where for<'a> T: Trait<'a>
{ ... }

( , ).

+4

:

fn f<T>(var: &T)
    where for<'a> T: Trait<'a>
{
    let input = 0i32;
    let output = var.get_output(&input);
}

. :

+3

Source: https://habr.com/ru/post/1671373/


All Articles