2015-06-22 2 views
2

У меня есть этот код:не может выйти из заимствованного контента - ссылка не работает

enum MyEnum1 { 
    val1, 
    val2 
} 

struct Struct1 { 
    field1: MyEnum1, 
    field2: String 
} 

fn fn1(a: Struct1, b: String, c: String) { 
    let let1 = fn2(&a.field1); 
} 


fn fn2(a: &MyEnum1) { 
    let a11 = *a; // error 
    let s = Struct1 { field1: a11, field2: "fdsfds".to_string() }; 
} 

fn main() { 
    println!("Hello World!"); 
} 

Ошибка Ошибка: не может выйти из заимствованного контента

Я предложил компилятор использовать ref или ref mut, я попытался использовать их, и все равно это не помогло.

fn fn2(a: &MyEnum1) { 
    let ref a11 = *a; // still the error 
    let s = Struct1 { field1: *a11, field2: "fdsfds".to_string() }; 
} 
+0

фактически ошибка теперь в следующей строке, а не в строке вы добавили 'еще на error' комментарий –

+0

@ker, нет ..... .. –

+1

решение заключается в реализации копии, вопрос в том, что «не может выйти из заимствованного контента», я думаю, что это очень дубликат –

ответ

3

Короткий ответ

Функция fn2 получает ссылку к MyEnum1 в качестве параметра, но Struct1 содержит принадлежитMyEnum1. Это означает, что вы на самом деле пытаетесь превратить ссылку в принадлежащее ей значение, что возможно только при копировании данных.

Длинный ответ

Ваш код будет работать, если MyEnum1 реализована Copy черта (которая, в свою очередь, требует реализации Clone признака). Если тип реализует Copy, он будет автоматически скопирован при его разыменовании и при его назначении (например, тип i32 в стандартной библиотеке реализует Copy). Попробуйте что-то вроде следующего:

#[derive(Clone, Copy)] 
enum MyEnum1 { 
    val1, 
    val2 
} 

Вы также можете выбрать для реализации только Clone и клонировать объект явно, в случае, если ваша структура данных является дорогостоящим для копирования (например, String структура в стандартной библиотеке реализует Clone но не Copy). Затем вам нужно будет использовать следующий код:

#[derive(Clone)] 
enum MyEnum1 { 
    val1, 
    val2 
} 

fn fn2(a: &MyEnum1) { 
    let s = Struct1 { field1: a.clone(), field2: "fdsfds".to_string() }; 
} 

Наконец, вы можете также выбрать пройти MyEnum1 по значению, а не по ссылке. Тогда, единственное изменение, которое необходимо применить это:

fn fn1(a: Struct1, b: String, c: String) { 
    let let1 = fn2(a.field1); 
} 

fn fn2(a: MyEnum1) { 
    let s = Struct1 { field1: a, field2: "fdsfds".to_string() }; 
} 
Смежные вопросы

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