& ldquo; заемная стоимость не живет достаточно долго & rdquo; с кодовым вызовом метода [дубликат]

Принятый ответ идеально подходит для вопроса OP. Я хотел добавить мое решение здесь, которое происходит от Мартина, поскольку это страница, на которую я был направлен, когда просто искал, как выкачать объект Request для Web API, чтобы я мог добавлять заголовки, которые ищет мой контроллер. Мне было трудно найти простой ответ:

   var controllerContext = new HttpControllerContext();
   controllerContext.Request = new HttpRequestMessage();
   controllerContext.Request.Headers.Add("Accept", "application/xml");

   MyController controller = new MyController(MockRepository);
   controller.ControllerContext = controllerContext;

И вот вы; очень простой способ создать контекст контроллера, с помощью которого вы можете «отморозить» объект «Запрос» и предоставить правильные заголовки для вашего метода контроллера.

3
задан Shepmaster 12 February 2015 в 17:29
поделиться

1 ответ

Ниже приведено минимальное воспроизведение:

pub struct Canvas;

impl Canvas {
    fn color(&self) -> &Canvas { self }
}

fn main() {
    let mut canvas = Canvas.color();
    //             1 ^~~~~~
    //                    2 ^~~~~
}

Проблема возникает из-за того, что вы создаете временную переменную (1), а затем передаете ссылку на эту переменную методу (2), который возвращает ссылку. В конце цепочки методов вы пытаетесь вернуть ссылку и сохранить ее в переменной, но ссылка указывает на временный элемент, который негде жить ! Rust не позволяет ссылаться на что-то недопустимое.

Часть проблемы состоит в том, что этот не является шаблоном Builder , это просто структура, которая модифицирует себя, используя вызов цепочки методов . Некоторые решения:

  1. Хранить «временную» переменную, и в этом случае все методы являются только обычными методами мутации, которые происходят после этого.
  2. Возьмите self вместо ссылаться на self (&self, &mut self), а затем в конечном итоге возвращать полную структуру.
  3. Использовать метод build в конце цепочки, который возвращает другую автономную структуру, а не ссылку.
10
ответ дан Shepmaster 22 August 2018 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: