Черта ржавчины и дженерики

Я только учусь на Rust, так что извините, если это вопрос для новичка...

Мне следует реализовать следующий признак (с дженериками) для структуры, но структура не имеет универсального типа, поэтому я получаю ошибки E0282...

trait MyTrait<T> {
    fn function(&self) -> Option<T>;
}

struct MyStruct {}
impl<T> MyTrait<T> for MyStruct {
    fn function(&self) -> Option<T>{
        None
    }
}
fn main() {
    println!("Ciao!");
    let my_struct = MyStruct{};

    //let _ = my_struct.function(); // doesn't work, error[E0282]: type annotations needed
    //let _: Option<_> = my_struct.function(); // doesn't work, error[E0282]: type annotations needed
    //let _: Option<_> = <MyStruct as MyTrait<_>>::function(&my_struct);// doesn't work, error[E0282]: type annotations needed

}

Есть идеи, как это решить?

Реализация типажа для моей структуры не является обязательной, но рекомендуется, поэтому я также думаю пропустить ее, если не найду решение :(

Заранее спасибо за вашу помощь

Как вы ожидаете, что компилятор определит тип?

Chayim Friedman 06.09.2024 13:03

Вы имеете в виду, что невозможно пропустить его даже в случае результата «Нет»? :(

marc0x71 06.09.2024 14:09

Тип также может иметь значение для случая None, компилятор не имеет возможности узнать об этом.

Chayim Friedman 06.09.2024 15:20
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Помимо встроенных типов, модуль типизации в Python предоставляет возможность определения общих типов, что позволяет вам определять типы, которые могут...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исходный ответ: аннотация типа необходима в вашей реализации признака, а не там, где вызывается функция. Без информации о типе неуниверсальный MyStruct не сможет узнать, какой универсальный тип использовать при реализации MyTrait. Предоставление типа универсального параметра в реализации признака исправит эти ошибки. Для этого примера я выбрал i32, но вы должны использовать то, что соответствует вашим потребностям.

trait MyTrait<T> {
    fn function(&self) -> Option<T>;
}

struct MyStruct {}
impl MyTrait<i32> for MyStruct {
    fn function(&self) -> Option<i32>{
        None
    }
}

fn main() {
    println!("Ciao!");
    let my_struct = MyStruct{};

    let _ = my_struct.function();
}

Обновление: В ответ на комментарий @jjthulhu: указание типа в реализации не является строго необходимым. После некоторых экспериментов я обнаружил, что следующее работает, но если общий тип известен, я бы все равно предпочел указать его в реализации.

trait MyTrait<T> {
    fn function(&self) -> Option<T>;
}

struct MyStruct {}
impl<T> MyTrait<T> for MyStruct {
    fn function(&self) -> Option<T>{
        None
    }
}

fn main() {
    println!("Ciao!");
    let my_struct = MyStruct{};

    let _ : Option<i32> = MyStruct::function(&my_struct);
}

Насколько я понимаю этот ответ, на самом деле он не точен. Вы можете реализовать MyTrait<T> для MyStruct для любого T, даже если T не появляется в выражении типа получателя реализации.

jthulhu 06.09.2024 22:02

Другие вопросы по теме

Похожие вопросы

Как я могу использовать типы, размер которых известен во время компиляции как длина массива, используя дженерики структур в ржавчине
Почему машинописный текст не позволяет частично указывать аргументы типа, чтобы создать новую универсальную функцию из другой универсальной функции?
Kotlin получает значение перечисления по его общему типу, если это перечисление
Реализация статической проверки границ в Rust с использованием typenum
Оператор Diamond расширяет то или иное
Как называется событие, которое передает только аргументы типа в общую функцию в машинописном тексте?
Проблема с методом универсального интерфейса TypeScript
Получение универсального класса, назначенного данному типу объекта
Почему байтовый срез не удовлетворяет общему ограничению типа любого среза?
Использование абстрактного класса с универсальным методом в качестве свойства в другом классе