#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()
}
}