Как перегрузить справочный оператор? - PullRequest
0 голосов
/ 15 мая 2018

Я реализовал AsRef<[u8]> для моего типа, и автоматическое преобразование в &[u8] с использованием .as_ref() работает, но оператор & не ... как я могу заставить оператора работать?

struct Buffer {
    data: Vec<u8>,
}

impl AsRef<[u8]> for Buffer {
    fn as_ref(&self) -> &[u8] {
        &self.data
    }
}

fn print_slice(slice: &[u8]) {
    slice.iter().for_each(|b| print!("{:02x}", b));
    println!()
}

fn main() {
    let buffer = Buffer {
        data: b"Testolope".to_vec(),
    };
    // print_slice(&buffer);     // <- This does not work
    print_slice(buffer.as_ref()) // <- This works
}
error[E0308]: mismatched types
  --> src/main.rs:20:17
   |
20 |     print_slice(&buffer);
   |                 ^^^^^^^ expected slice, found struct `Buffer`
   |
   = note: expected type `&[u8]`
              found type `&Buffer`

Я хочу общее решение.Другие типы данных, такие как Vec<u8>, поддерживают преобразование в &[u8] с помощью оператора &.Было бы здорово, если бы я мог сделать эту работу для своих типов, чтобы мне не приходилось каждый раз использовать .as_ref().

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

impl std::ops::Deref for Buffer {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        &self.data
    }
}

В этом случае работает ваш оригинальный код.

См.также:

0 голосов
/ 15 мая 2018

Вы вызываете всю структуру с print_slice(&buffer);, но только поле data с print_slice(buffer.as_ref()).Если вы сделаете это print_slice(&buffer.data), это будет работать.Или измените сигнатуру типа функции print_slice на ожидаемую &Buffer, из-за чего строка as_ref() не будет работать.

...