Почему компилятор выдает ошибку «цикл обнаружен при обработке ...»? - PullRequest
0 голосов
/ 13 апреля 2020

Для контекста, я использую библиотеку Vulkano для создания игры, поэтому я пропустил весь импорт Vulkano. Я пытался использовать функцию render() для визуализации моего мира, но меня смущает ошибка, потому что я не ссылаюсь ни на какие реализации из world.rs в mesh.rs. Я только что начал использовать Rust уже несколько месяцев, так что я все еще могу быть запутан с чертами и прочим.

Каталог исходного кода проекта

src
  - main.rs  // imports all the module file in the directory
  - mesh.rs  // does not import `world.rs` module
  - world.rs  // imports the `mesh.rs` module
  - ...

me sh .rs

pub trait Mesh {
    type Vertex;

    fn vert_data(&self, texture: &TextureAtlas, position: [f32; 3]) -> Vec<Self::Vertex>;  // returns the vertex data
    fn ind_data(&self, index: u32) -> Vec<u32>;  // returns the index data
}

pub struct Cube {
    top: [u16; 2],
    bottom: [u16; 2],
    left: [u16; 2],
    right: [u16; 2],
    front: [u16; 2],
    back: [u16; 2],
}

impl Cube {
    /* ... */
}

impl Mesh for Cube {
    /* ... */
}


Я проверил другие операции импорта в world.rs, но ни один из них не импортирует world.rs.

world.rs

use crate::mesh::Cube;
use crate::mesh::Mesh;

pub struct World<V, M> {
    name: String,
    chunk: Vec<Chunk<V, M>>,
}

impl<V, M> World<V, M> {
    pub fn render(device: Arc<Device>, txtr: &TextureAtlas) -> (Arc<CpuAccessibleBuffer<[dyn Mesh<Vertex=CubeVtx>]>>, Arc<CpuAccessibleBuffer<[_]>>) {
    }

    /* ... */
}

Ошибка:

error[E0391]: cycle detected when processing `world::<impl at src\world.rs:24:1: 88:2>::render`
  --> src\world.rs:34:5
   |
34 |     pub fn render(device: Arc<Device>, txtr: &TextureAtlas) -> (Arc<CpuAccessibleBuffer<[dyn Mesh<Vertex=CubeVtx>]>>, Arc<CpuAccessibleBuffer<[_]>>) {
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
note: ...which requires processing `world::<impl at src\world.rs:24:1: 88:2>::render`...
  --> src\world.rs:34:5
   |
34 |     pub fn render(device: Arc<Device>, txtr: &TextureAtlas) -> (Arc<CpuAccessibleBuffer<[dyn Mesh<Vertex=CubeVtx>]>>, Arc<CpuAccessibleBuffer<[_]>>) {
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...which requires processing `mesh::Cube`...
  --> src\mesh.rs:31:1
   |
31 | pub struct Cube {
   | ^^^^^^^^^^^^^^^
   = note: ...which requires computing the variances for items in this crate...
   = note: ...which again requires processing `world::<impl at src\world.rs:24:1: 88:2>::render`, completing the cycle
note: cycle used when collecting item types in module `world`
  --> src\main.rs:50:1
   |
50 | mod world;
   | ^^^^^^^^^^

Я подозревал, что это может быть связано с признаком Mesh.

Я попытался удалить каталог target и отделил реализацию Mesh, чтобы отделить файл, оставляя только черта в исходном файле.

1 Ответ

0 голосов
/ 19 апреля 2020

Так что я оказался очень наивным по отношению к сложной системе черт Руста. Единственное изменение, которое я должен был сделать, это добавить 'static время жизни к типу ассоциированного объекта Vertex, что устраняет проблему, которая действительно сбивает с толку тот факт, что ошибка отображается в виде циклической ссылки.

pub trait Mesh {
    type Vertex: 'static;

    fn vert_data(&self, texture: &TextureAtlas, position: [f32; 3]) -> Vec<Self::Vertex>;  // returns the vertex data
    fn ind_data(&self, index: u32) -> Vec<u32>;  // returns the index data
}
...