Вывод значения в vec из другого модуля: поле структуры является закрытым

#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
}
  

Обратите внимание, что имеет смысл, чтобы структура была общедоступной, имея ее
члены являются частными.
Это гарантирует инкапсуляцию: доступны только члены структуры
из методов его реализации (и окружающего кода в модуле).
Конечно, эти методы также могут быть общедоступными или частными.