#rust
#Ржавчина
Вопрос:
Я не могу распечатать значения из Vec из модуля, не могли бы вы, пожалуйста, помочь?
Вот содержимое функции в модуле:
pub struct Author {
_id: i32,
name: String,
country: String
}
pub fn get_saved_records() -> Result<Vec<Author>,Error>{
let mut client = Client::connect("postgresql://***:***@localhost/****",NoTls)?;
let records = client.query("SELECT * FROM author",amp;[])?;
let mut the_records : Vec<Author> = vec![];
for record in records{
let author = Author {
_id: record.get(0),
name: record.get(1),
country: record.get(2),
};
the_records.push(author);
}
Ok(the_records)
}
Вот основной файл, в котором я вызываю функцию get_saved_records():
match db::get_saved_records(amp;mut conn){
Ok(records) => {
for record in records{
println!("{}",record.name);
}
},
Err(_) => println!("No record found")
}
Я получаю сообщение об ошибке: поле name
структуры db::Author
является закрытым.
Спасибо.
Ответ №1:
Члены вашей структуры должны быть объявлены pub
, чтобы быть доступными напрямую.
Здесь доступен только name
элемент.
pub struct Author {
_id: i32,
pub name: String,
country: String
}
Обратите внимание, что имеет смысл, чтобы структура была общедоступной, имея ее
члены являются частными.
Это гарантирует инкапсуляцию: доступны только члены структуры
из методов его реализации (и окружающего кода в модуле).
Конечно, эти методы также могут быть общедоступными или частными.