gpt4 book ai didi

generics - 当泛型参数具有多种数据类型时,如何在rust中实现泛型?

转载 作者:行者123 更新时间:2023-12-03 11:39:23 26 4
gpt4 key购买 nike

我是Rust的新手。
我正在尝试在rust中实现泛型函数,但是我正面临着问题。我尝试了许多来自google的示例来获取解决方案,但是没有任何效果。请帮我。
在下面的代码中,我想为add实现Point函数,该函数可以采用i32或另一个Point

fn main() {
println!("Hello world!");
let mut point = Point::new(1,1);
point.add::<i32>(&1);
point.add::<Point>(&point);
}

#[derive(Copy, Clone)]
struct Point {
pub x: i32,
pub y: i32,
}

impl Point {
pub fn new(x: i32, y: i32) -> Point {
Point {x, y}
}

/**
Pseudocode as i don't know how to write this in rust
pub fn add<T: Sized || Point>(&mut self, value: &T) {
if (T is i32) {
self.x += = value;
self.y += value;
} else (T is Point) {
self.x += value.x;
self.y += value.y;
}

}
*/
}

最佳答案

您可以使用特征来做到这一点。由于PointCopy,因此也无需使用引用:

#[derive(Copy, Clone)]
struct Point {
pub x: i32,
pub y: i32,
}

impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x, y }
}
}

trait AddToPoint<T> {
fn add(&mut self, value: T);
}

impl AddToPoint<i32> for Point {
fn add(&mut self, value: i32) {
self.x += value;
self.y += value;
}
}

impl AddToPoint<Point> for Point {
fn add(&mut self, value: Point) {
self.x += value.x;
self.y += value.y;
}
}

fn main() {
println!("Hello world!");
let mut point = Point::new(1,1);
point.add(1);
point.add(point);
}
另一种可能性是通过实现trait std::ops::AddAssign来使用运算符重载。然后,您可以使用 +=运算符将值添加到点:
use std::ops::AddAssign;

#[derive(Copy, Clone)]
struct Point {
pub x: i32,
pub y: i32,
}

impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x, y }
}
}

impl AddAssign<i32> for Point {
fn add_assign(&mut self, value: i32) {
self.x += value;
self.y += value;
}
}

impl AddAssign<Point> for Point {
fn add_assign(&mut self, value: Point) {
self.x += value.x;
self.y += value.y;
}
}

fn main() {
println!("Hello world!");
let mut point = Point::new(1,1);
point += 1;
point += point;
}

关于generics - 当泛型参数具有多种数据类型时,如何在rust中实现泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63259570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com