[英]cannot subtract `T` from `T` in rust
我正在制作一个包含 2 个值x
和y
的point
struct
以及一个包含两个值first_point
和second_point
的line
struct
,所有这些结构都是通用类型,所以我想为Line
结构创建一个成员方法,但它说cannot subtract `T` from `T`
impl<T> Line<T> {
fn len(&self) -> T {
let x = (self.second_point.x) - (self.first_point.x) ;
let y = (self.second_point.y) - (self.first_point.y) ;
return ((x * x) + (y * y)).sqrt() ;
}
}
这是错误的方式:
error[E0369]: cannot subtract `T` from `T`
--> src/sources.rs:19:39
|
19 | let x = (self.second_point.x) - (self.first_point.x) ;
| --------------------- ^ -------------------- T
| |
| T
|
help: consider restricting type parameter `T`
|
16 | impl<T: std::ops::Sub<Output = T>> Line<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0369]: cannot subtract `T` from `T`
--> src/sources.rs:20:39
|
20 | let y = (self.second_point.y) - (self.first_point.y) ;
| --------------------- ^ -------------------- T
| |
| T
|
help: consider restricting type parameter `T`
|
16 | impl<T: std::ops::Sub<Output = T>> Line<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0369`.
我是 Rust 的初学者,所以如果您能帮助我,我将不胜感激:
如果您有兴趣,这是完整的代码
pub fn test_function() {
let line = make_a_line(make_a_point(10, 20), make_a_point(10, 20));
}
struct Point<T> {
x:T,
y:T
}
struct Line<T> {
first_point: Point<T>,
second_point: Point<T>,
}
impl<T> Line<T> {
fn len(&self) -> T {
let x = (self.second_point.x) - (self.first_point.x) ;
let y = (self.second_point.y) - (self.first_point.y) ;
return ((x * x) + (y * y)).sqrt() ;
}
}
fn make_a_point<T>(x_axix:T, y_axis:T) -> Point<T>{
Point{x: x_axix, y: y_axis}
}
fn make_a_line<T>(start: Point<T>, end: Point<T>) -> Line<T> {
Line{first_point: start, second_point: end}
}
要使+
、 -
和*
等运算符适用于某个类型(在这种情况下为T
),必须为其实现特定于运算符的std
特征: std::ops::Add
、 std::ops::Sub
、 std::ops::Mul
。 然后T
必须受到约束,以便它实现它们。 为此更正您的代码可能如下所示:
pub fn test_function() {
let line = make_a_line(make_a_point(10, 20), make_a_point(10, 20));
}
struct Point<T>
where T: std::marker::Copy + std::ops::Sub<Output=T> + std::ops::Mul<Output=T> + std::ops::Add<Output=T>,
{
x:T,
y:T
}
struct Line<T>
where T: std::marker::Copy + std::ops::Sub<Output=T> + std::ops::Mul<Output=T> + std::ops::Add<Output=T>,
{
first_point: Point<T>,
second_point: Point<T>,
}
impl<T> Line<T>
where T: std::marker::Copy + std::ops::Sub<Output=T> + std::ops::Mul<Output=T> + std::ops::Add<Output=T>,
{
fn len(&self) -> T {
let x = (self.second_point.x) - (self.first_point.x) ;
let y = (self.second_point.y) - (self.first_point.y) ;
return ((x * x) + (y * y)) ;
}
}
fn make_a_point<T>(x_axix:T, y_axis:T) -> Point<T>
where T: std::marker::Copy + std::ops::Sub<Output=T> + std::ops::Mul<Output=T> + std::ops::Add<Output=T>,
{
Point{x: x_axix, y: y_axis}
}
fn make_a_line<T>(start: Point<T>, end: Point<T>) -> Line<T>
where T: std::marker::Copy + std::ops::Sub<Output=T> + std::ops::Mul<Output=T> + std::ops::Add<Output=T>,
{
Line{first_point: start, second_point: end}
}
注意两件事:我也有T
实现std::marker::Copy
,因为这使得使用操作符特征更容易。 此外,您使用了srqt()
function。 但是,此 function 仅适用于特定类型f32
和f64
。 我只是删除了上面代码中的调用以使其编译为整数。 如果您真的需要这样的 function 可能num-traits板条箱可以帮助您,正如@Ibraheem Ahmed 指出的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.