Принятый ответ идеально подходит для вопроса 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;
И вот вы; очень простой способ создать контекст контроллера, с помощью которого вы можете «отморозить» объект «Запрос» и предоставить правильные заголовки для вашего метода контроллера.
Ниже приведено минимальное воспроизведение:
pub struct Canvas;
impl Canvas {
fn color(&self) -> &Canvas { self }
}
fn main() {
let mut canvas = Canvas.color();
// 1 ^~~~~~
// 2 ^~~~~
}
Проблема возникает из-за того, что вы создаете временную переменную (1), а затем передаете ссылку на эту переменную методу (2), который возвращает ссылку. В конце цепочки методов вы пытаетесь вернуть ссылку и сохранить ее в переменной, но ссылка указывает на временный элемент, который негде жить ! Rust не позволяет ссылаться на что-то недопустимое.
Часть проблемы состоит в том, что этот не является шаблоном Builder , это просто структура, которая модифицирует себя, используя вызов цепочки методов . Некоторые решения:
self
вместо ссылаться на self (&self
, &mut self
), а затем в конечном итоге возвращать полную структуру. build
в конце цепочки, который возвращает другую автономную структуру, а не ссылку.