2014-12-25 4 views
4

Мое понимание заключается в том, что изменчивый заемщик может перевести право собственности на другого изменчивого заемщика. Но этот ход, похоже, немного отличается от перемещения переменной без указателя. Давайте посмотрим пример. Ниже p1 переходит в p2, когда compute() называется в первый раз. Но право собственности возвращается к p1 после того, как compute() возвращается.Перемещение изменчивого заимствования

fn compute(p2: &mut Point) { 
} 

fn reset(p1: &mut Point) { 
    compute(p1); //OK 
    compute(p1); //OK 
} 

Это отличается от того, как перемещается регулярная переменная.

fn compute(p2: Point) { 
} 

fn reset(p1: Point) { 
    compute(p1); //OK 
    compute(p1); //Compile error 
} 

Теперь собственность не вернуться к p1 после первых compute() возвращения вызова.

Оба поведения понятны и желательны по многим причинам. Но я просто хотел подтвердить свое понимание, что эти два движения несколько отличаются по своей природе. Правильно ли я так думаю?

+0

«изменяемый заемщик может перейти в собственность к другому изменяемым заемщика» - на мой взгляд, вы либо * собственный * объект или * заимствуют * один, там нет концепция «заемного владения». – Shepmaster

+0

@Shepmaster, ссылки являются регулярными значениями, и они также являются субъектами правил владения. Без reborrowing '& mut' будет вести себя точно так же, как и другие типы noncopyable (т. Е. Они могут быть перемещены только). –

ответ

2

Вы правы, за исключением того, что в первом случае ссылка не перемещается, она просто перерисовывается, что является поведением, характерным для ссылок. Возможно, это очищает его, поскольку это не исключение в семантике перемещения, но совсем другое поведение.

2

Способ, которым я понимаю, заключается в том, что ваш первый фрагмент заимствует, где, как и ваша вторая передача собственности. не

fn compute(p2: Point) { 
    // compute owns p2 
} // owned p2 is freed 

fn reset(p1: Point) { 
    // reset() owns p1 
    compute(p1); //Ownership of p1 is transferred to compute() 
    compute(p1); //ERROR: p1 has already been freed 
} 

Вице ...

fn compute(p2: &Point) { 
    // compute is borrowing p2 
} // borrowed p2 is given back to owner 

fn reset(p1: Point) { 
    // reset() owns p1 
    compute(&p1); //let compute() borrow p1, then get it back 
    compute(&p1); //let compute() re-borrow p1, then give it back 
} // owned p1 is freed 
+0

Они будут передавать права собственности, поскольку изменяемый указатель является неподъемным типом. Тем не менее, «reborrow» происходит для изменяемого указателя после возврата функции compute(), что делает переменную указателя полезной снова. Это мое понимание. Будет хорошо видеть более официальное объяснение этому. – RajV

Смежные вопросы