Встраивание универсального Rust с универсальными функциями в другую структуру - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть этот универсальный тип:

pub struct MyContainer<T, S> {
    array: Vec<T>,
    get_size: S,
    size: u32,
}

impl<T: Default, S> MyContainer<T, S>
where
    S: Fn(&T) -> u32,
{
    pub fn new(size: u32, get_size: S) -> MyContainer<T, S> {
        let array = Vec::with_capacity(size as usize);
        MyContainer {
            array,
            get_size,
            size,
        }
    }
}

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

pub fn get_size_func(h: &House) -> u32 {
    h.num_rooms
}
let container = MyContainer::new(6, get_size);

Однако у меня возникает проблема, когда я пытаюсь создать экземпляр моего универсального типа в другой структуре:

pub struct City {
    suburbs: MyContainer<House, fn(&House) -> u32>,
}

impl City {
    pub fn new(num_houses: u32) -> City {
        let container = MyContainer::new(num_houses, get_size_func);
        City { suburbs: container }
    }
}

Я получаю

error[E0308]: mismatched types
  --> src/lib.rs:44:25
   |
44 |         City { suburbs: container }
   |                         ^^^^^^^^^ expected fn pointer, found fn item
   |
   = note: expected type `MyContainer<_, for<'r> fn(&'r House) -> u32>`
              found type `MyContainer<_, for<'r> fn(&'r House) -> u32 {get_size_func}>`

Вот игровая площадка Rust, которая воспроизводит проблему

1 Ответ

0 голосов
/ 02 ноября 2018

На этот вопрос есть два ответа:

  1. Указание параметров типа при создании контейнера. Я не знаю, почему это работает, но это делает:

    let container = MyContainer::<House, fn(&House) -> u32>::new(num_houses, get_size_func);
    
  2. Вы также можете определить универсальную функцию, которая вызывает универсальную черту для добавленного удара. Например:

     let container = MyContainer::<House, fn(&House) -> u32>::new(num_houses, get_size_func2::<House>);
    

    get_size_func2 будет обобщенной функцией, связанной с признаком.

Вот полная игровая площадка . Для обоих решений параметры типа являются обязательными и не выводятся в функции City::new.

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