Упоминает ли документация возможность добавления ключевого слова mut перед аргументами функций? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть базовая Reader инкапсуляция некоторых общих элементов:

pub struct Reader<R> {
    inner: R,
    order: Endian,
    first_ifd_offset: usize,
}

impl<R: Read + Seek> Reader<R> {
    pub fn new(reader: R) -> Result<Reader<R>> {
        let mut order_raw = [0, 0];
        reader.read_exact(&mut order_raw)?;
        let magic_number = u16::to_be(u16::from_bytes(order_raw));
        /* ... */
   }
}

Не компилируется и выдает следующую ошибку:

error[E0596]: cannot borrow immutable argument `reader` as mutable
  --> src/reader.rs:17:9
   |
15 |     pub fn new(reader: R) -> Result<Reader<R>> {
   |                ------ consider changing this to `mut reader`
16 |         let mut order_raw = [0, 0];
17 |         reader.read_exact(&mut order_raw)?;
   |         ^^^^^^ cannot borrow mutably

Поскольку я получаю аргумент по значению, функция new должна быть новым владельцем элемента reader. Компилятор советует мне добавить ключевое слово mut перед аргументом функции.

Упоминает ли в документации возможность добавления ключевого слова mut перед аргументами функций? Мне не удалось найти ресурсы, упоминающие об этом.

Структура BufReader стандартной библиотеки имеет похожая функция new и не использует ключевое слово mut, но unsafe блочный код в теле. unsafe препятствует использованию mut в сигнатуре функции?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Это подразумевается, но прямо не упоминается в книге. И let, и аргументы функций являются шаблонами, поэтому вы можете использовать mut в let и использовать его в аргументах.

0 голосов
/ 27 июня 2018

Я думаю, что компилятор очень точно сказал, куда добавить mut. Обычно компилятор пытается подчеркнуть определенные места:

pub fn new(mut reader: R) -> Result<Reader<R>>

Теперь возможно изменить видоискатель в функции. Это ведет себя как:

pub fn new(reader: R) -> Result<Reader<R>, Error> {
    let mut reader = reader;
    // ...

Насколько я знаю, в книге упоминается только один раз , но более или менее в смысле Это шаблон, вы можете использовать его и в функциях .

unsafe не исправляет это, это UB :

Мутирование неизменяемых данных - то есть данных, полученных через общую ссылку или данные, принадлежащие привязке let), если только эти данные не содержатся в UnsafeCell<U>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...