Giter Site home page Giter Site logo

Comments (8)

asomers avatar asomers commented on July 21, 2024

This is a complicated trait. Does it work if you define that method like this? fn iter_mut(&mut self) -> impl Iterator<Item = &'static mut Self::T>;

from mockall.

vitornesello avatar vitornesello commented on July 21, 2024

with this modification, I have the following error:

   Compiling playground-rs v0.1.0 (/Users/vitornesello/code/playground-rs)
error[E0310]: the associated type `<Self as Foo>::T` may not live long enough
 --> src/main.rs:8:45
  |
8 |     fn iter_mut(&mut self) -> impl Iterator<Item = &'static mut Self::T>;
  |                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |                                             |
  |                                             the associated type `<Self as Foo>::T` must be valid for the static lifetime...
  |                                             ...so that the reference type `&'static mut <Self as Foo>::T` does not outlive the data it points at
  |
  = help: consider adding an explicit lifetime bound `<Self as Foo>::T: 'static`...

from mockall.

asomers avatar asomers commented on July 21, 2024

Did you try following that suggestion and adding the bound?

from mockall.

vitornesello avatar vitornesello commented on July 21, 2024

I could make it work like this, but I not sure if it is exactly what the suggestion was saying:

#[automock(type T=String;)]
trait Foo {
    type T: 'static;
    fn iter(&self) -> impl Iterator<Item = usize>;
    fn iter_mut(&mut self) -> impl Iterator<Item = &'static mut <Self as Foo>::T>;
}

However, it seems odd to me to require a static lifetime in this trait. Am I missing something?

from mockall.

asomers avatar asomers commented on July 21, 2024

That's actually not as odd as you might think. In order to store the expectation, Mockall requires that the lifetime of return values be either the same as the object itself, or else 'static. And "the same as the object itself" only works for a few common cases like &T.
https://docs.rs/mockall/latest/mockall/#reference-return-values

from mockall.

vitornesello avatar vitornesello commented on July 21, 2024

Thanks a lot! I realize that I need a deeper understanding of lifetimes. I am quite new to the concept.

from mockall.

mrchilliballs avatar mrchilliballs commented on July 21, 2024

That's actually not as odd as you might think. In order to store the expectation, Mockall requires that the lifetime of return values be either the same as the object itself, or else 'static. And "the same as the object itself" only works for a few common cases like &T. https://docs.rs/mockall/latest/mockall/#reference-return-values

Could you consider clarifying what "the same as the object itself" means in the documentation? I stumbled upon the issue a while ago, and clearer documentation would have been helpful. Thanks!

from mockall.

asomers avatar asomers commented on July 21, 2024

When mocking a function that returns a reference, Mockall stores that referent within the mock object. For example:

#[automock]
pub trait Foo {
    fn foo(&self) -> &i32;
}

#[test]
fn t() {
    let mut mock = MockFoo::new();
    mock.expect_foo()
        .return_ref(42i32);
}

As you can see, we store a real i32 within the Mock object. So that i32 must have that same lifetime as the mock object itself. Mockall also has a few hard-coded special cases for methods that return references. For example, a method that returns a &str reference will take a String argument in its return_ref function. And if the function returns a 'static reference, then you can pass any anything you want to return_const or returning.

from mockall.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.