Я только учусь на 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
}
Есть идеи, как это решить?
Реализация типажа для моей структуры не является обязательной, но рекомендуется, поэтому я также думаю пропустить ее, если не найду решение :(
Заранее спасибо за вашу помощь
Вы имеете в виду, что невозможно пропустить его даже в случае результата «Нет»? :(
Тип также может иметь значение для случая None, компилятор не имеет возможности узнать об этом.

Исходный ответ: аннотация типа необходима в вашей реализации признака, а не там, где вызывается функция. Без информации о типе неуниверсальный 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 не появляется в выражении типа получателя реализации.
Как вы ожидаете, что компилятор определит тип?