Как реализовать метод, который работает для всех параметров типа структуры?

#rust

#Ржавчина

Вопрос:

У меня есть следующая структура

 struct Position<T> {
    ns: i32,
    we: i32,
    orientation: T
}
 

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

 impl Position {
    fn distance(amp;self) -> i32 {
        self.ns.abs()   self.we.abs()
    }
}
 

Я попытался добавить параметр типа в строку impl, но, по-видимому, это работает только для конкретного типа, а не для переменной типа, которая мне понадобится здесь, чтобы делать то, что я хочу, я думаю. Я пробовал что-то вроде <_> , но тоже без кубиков.

Возможно ли это сделать в Rust?

Ответ №1:

Если у вас есть методы Position , которые применяются к любому T , вы можете поместить их в a impl , который не имеет границ:

 impl<T> Position<T> {
    fn distance(amp;self) -> i32 {
        self.ns.abs()   self.we.abs()
    }
    
    // fn ....
}
 

Помните, что у вас может быть несколько impl блоков для типа. Итак, если у вас есть методы, которые требуют T привязки, вы можете добавить

 impl<T: Clone> Position<T> {
    // fn ...
}
 

Комментарии:

1. о, хорошо, я попробовал <T> рядом с позицией, но мне не хватало <T> рядом с impl . это было то, чего мне не хватало, спасибо

Ответ №2:

T является неотъемлемой частью Position , поэтому вам нужно impl Position<T> , но тогда T не существует в области impl блока (между блоками и нет внутренней связи struct impl , действительно, они могут использовать совершенно разные имена параметров), поэтому вам нужно объявить его:

 impl<T> Position<T> {
    fn distance(amp;self) -> i32 {
        self.ns.abs()   self.we.abs()
    }
}