我试图实现一个可以接受任何类型参数的通用结构。
struct Position<T>{
x: T,
y: T,
}
impl<T:Num> Position<T>{
fn add(&self, other: &Position<T>) -> Box<Position<T>>{
box Position{x:self.x + other.x, y:self.y + other.y}
}
fn display(&self) -> String{
"WELCOME ".to_string()
}
}
现在我可以定义
let original_position = Position::<int>{x: 2, y:23};
let another_postion = original_position.add(&original_position);
let welcome = original_postion.display();
没有任何错误
同样,我可以毫无错误地执行以下操作。
let string_position = Position::<String>{x: "x_pos".to_string(), y: "y_pos".to_string()};
现在由于Num特征约束,我无法调用以下内容(这很明显)。
string_position.add(&original_position);
但是,我的问题是,由于相同的Num特征约束,我现在无法调用以下内容
string_position.display()
上面的函数与Num类型有关,它只返回字符串&#34; WELCOME&#34;
我如何重写实现,以便只能通过Position<Num>
调用add方法,并且可以通过任何其他通用实现调用display。
答案 0 :(得分:2)
你应该创建单独的实现,一个是绑定的,另一个没有,像这样:
impl<T:Num> Position<T>{
fn add(&self, other: &Position<T>) -> Box<Position<T>>{
box Position{x:self.x + other.x, y:self.y + other.y}
}
}
impl<T> Position<T>{
fn display(&self) -> String{
"WELCOME ".to_string()
}
}
您可以看到它有效here。