"impl требует базового типа" для массива, подобного типу в Rust - PullRequest
0 голосов
/ 12 октября 2019

Я определил тип как массив с фиксированным размером, и я пытаюсь реализовать некоторые пользовательские методы для него.

type Vec3 = [f64; 3];

impl Vec3 {
    fn display(&self) {
        println!("x = {}, y = {}, z = {}", self[0], self[1], self[2]);
    }
}

Я получаю эту ошибку:

error[E0118]: no base type found for inherent implementation
 --> src/main.rs:7:6
  |
7 | impl Vec3 {
  |      ^^^^ impl requires a base type
  |
  = note: either implement a trait on it or create a newtype to wrap it instead

error: aborting due to previous error

Что такоехарактер этой ошибки и как мне исправить мой код?

1 Ответ

2 голосов
/ 12 октября 2019

Ваша строка

type Vec3 = [f64; 3];

на самом деле не объявляет новый тип, она просто объявляет псевдоним типа с именем Vec3 для массива [f64; 3].

Когда мы запускаем rustc --explain E0118, компилятор Rust услужливо описывает его для нас:

You're trying to write an inherent implementation for something which isn't a
struct nor an enum.

Итак, вы можете использовать impl только для struct или enum. Быстрое решение в вашем случае - объявить Vec3 структурой кортежа :

struct Vec3([f64; 3]);

Но тогда это означает несколько переписать ваш метод display. Для ясности мы деструктурируем до локальной переменной:

    let Self(vec) = self;
    println!("x = {}, y = {}, z = {}", vec[0], vec[1], vec[2]);

Рабочий пример можно увидеть на игровой площадке (43122f5fdbd157b9925a5fd2f660c329) .

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