Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why do I get Lifetime 'a already in scope error when trying to use the same lifetime argument in method?

In the following code i get the error Lifetime 'a already in scope for the new method. What is the issue in using the same scope as A? I thought it made sense.

struct A <'a>{
    a: Vec<&'a str>,
    b: Vec<&'a str>
}

impl <'a> A<'a> {
    fn new<'a>(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
        A {a: vec![a, b], b: vec![c, d]}
    }
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The error message:

error[E0496]: lifetime name `'a` shadows a lifetime name that is already in scope
 --> src/lib.rs:7:12
  |
6 | impl <'a> A<'a> {
  |       -- first declared here
7 |     fn new<'a>(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
  |            ^^ lifetime `'a` already in scope

For more information about this error, try `rustc --explain E0496`.

makes the problem very clear.

Once you delete the errornoues lifetime declaration:

struct A <'a>{
    a: Vec<&'a str>,
    b: Vec<&'a str>
}

impl <'a> A<'a> {
    fn new(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
        A {a: vec![a, b], b: vec![c, d]}
    }
}

and recompile, you will get:

error[E0621]: explicit lifetime required in the type of `a`
 --> src/lib.rs:8:9
  |
7 |     fn new(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
  |               ---- help: add explicit lifetime `'a` to the type of `a`: `&'a str`
8 |         A {a: vec![a, b], b: vec![c, d]}
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'a` required

error[E0621]: explicit lifetime required in the type of `b`
 --> src/lib.rs:8:9
  |
7 |     fn new(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
  |                        ---- help: add explicit lifetime `'a` to the type of `b`: `&'a str`
8 |         A {a: vec![a, b], b: vec![c, d]}
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'a` required

error[E0621]: explicit lifetime required in the type of `c`
 --> src/lib.rs:8:9
  |
7 |     fn new(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
  |                                 ---- help: add explicit lifetime `'a` to the type of `c`: `&'a str`
8 |         A {a: vec![a, b], b: vec![c, d]}
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'a` required

error[E0621]: explicit lifetime required in the type of `d`
 --> src/lib.rs:8:9
  |
7 |     fn new(a: &str, b: &str, c: &str, d: &str) -> A<'a> {
  |                                          ---- help: add explicit lifetime `'a` to the type of `d`: `&'a str`
8 |         A {a: vec![a, b], b: vec![c, d]}
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'a` required

For more information about this error, try `rustc --explain E0621`.

Which makes it clear that you need to just add the explicit lifetime for the parameters:

struct A <'a>{
    a: Vec<&'a str>,
    b: Vec<&'a str>
}

impl <'a> A<'a> {
    fn new(a: &'a str, b: &'a str, c: &'a str, d: &'a str) -> A<'a> {
        A {a: vec![a, b], b: vec![c, d]}
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading