繁体   English   中英

不能从 rust 中的“T”中减去“T”

[英]cannot subtract `T` from `T` in rust

我正在制作一个包含 2 个值xypoint struct以及一个包含两个值first_pointsecond_pointline 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::Addstd::ops::Substd::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 仅适用于特定类型f32f64 我只是删除了上面代码中的调用以使其编译为整数。 如果您真的需要这样的 function 可能num-traits板条箱可以帮助您,正如@Ibraheem Ahmed 指出的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM