Я хотел бы создать свою собственную черту, которая должна давать i32
на основе индексации с f32
. Я попробовал следующее, которое, кажется, работает:
use std::ops::Index;
// trait by value
pub trait MyTrait:
Index<f32, Output=i32> {
}
Хотя передача значения f32
может быть хорошей идеей, для более сложных типов я бы вместо этого передал ссылку на значение, поэтому Я попробовал следующее:
// trait by reference, not compiling
pub trait MyTrait:
Index<&f32, Output=i32> {
}
Включение этого определения дает мне error[E0106]: missing lifetime specifier
. У меня работает этот вариант:
// trait by reference, compiling
pub trait MyTrait<'a>:
Index<&'a f32, Output=i32> {
}
Проблема в том, что, хотя этот подход работает, это означает, что любой тип, реализующий MyTrait
, нуждается в явном аргументе времени жизни.
Однако, это кажется довольно ненужным: если я реализую черту Index
для своей собственной структуры, мне не нужны никакие времена жизни:
struct Test {
value: i32
}
impl Index<&f32> for Test {
type Output = i32;
fn index(&self, _key: &f32) -> &Self::Output {
&self.value
}
}
Вопрос 1: Зачем мне нужен дополнительное время жизни в определении признака, почему оно не может быть исключено?
Вопрос 2: Могу ли я определить признак таким образом, чтобы избежать необходимости вводить время жизни?