Generics 如何约束运算符实现的右侧参数的类型?

Generics 如何约束运算符实现的右侧参数的类型?,generics,rust,polymorphism,traits,parametric-polymorphism,Generics,Rust,Polymorphism,Traits,Parametric Polymorphism,试图实现一个通用的Vec实现std::ops::Add特征。我希望实现在加法时自动转换向量的基本类型,这样我就可以执行以下操作: 设u:Vec3=Vec3{x:1,y:2,z:3}; 设v:Vec3=Vec3{x:2,y:3,z:4}; 设w=u+v; 不在调用站点使用.into()。我已经实现了来自trait的(它会自动将添加到实现中),它在一个简单的函数上运行良好: fn foo(输入:T)->Vec3{ input.into() } 设v:Vec3=Vec3{x:2,y:3,z:4};

试图实现一个通用的
Vec
实现
std::ops::Add
特征。我希望实现在加法时自动转换向量的基本类型,这样我就可以执行以下操作:

设u:Vec3=Vec3{x:1,y:2,z:3};
设v:Vec3=Vec3{x:2,y:3,z:4};
设w=u+v;
不在调用站点使用
.into()
。我已经实现了来自trait的
(它会自动将
添加到
实现中),它在一个简单的函数上运行良好:

fn foo(输入:T)->Vec3{
input.into()
}
设v:Vec3=Vec3{x:2,y:3,z:4};
普林顿!(“{:?}”,foo(v));
链接到非编译示例。是否可以表示运算符右侧参数类型的约束?如果可以,如何表示

#![允许(死代码)]
使用std::convert::{From};
使用std::ops::{Add};
#[导出(调试)]
结构向量3{
x:T,
y:T,
z:T,
}
Vec3的impl-Add{
类型输出=Vec3;
fn add(self,rhs:U)->self::Output{
让rhs_转换为:Vec3=rhs.into();
Vec3{
x:self.x.add(rhs_.x),
y:self.y.add(rhs_.y),
z:self.z.add(rhs_.z),
}
}
}
Vec3的impl From{
fn from(输入:Vec3)->Self{
Vec3{
x:input.x.into(),
y:将.y.输入()中,
z:将.z.输入()中,
}
}
}
fn foo(输入:T)->Vec3{
input.into()
}
fn main(){
设u:Vec3=Vec3{x:1,y:2,z:3};
设v:Vec3=Vec3{x:2,y:3,z:4};
设w=u+v;
//println!(“{:?}”,foo(v));
println!(“{:?}”,w);
}

您需要在
添加
实现中将
U:Into
更改为
U:Into
。此外,泛型
impl
中缺少类型参数
U
声明,它应该是
impl
而不仅仅是
impl
。在这些次要修复之后,您的代码将按预期工作:

使用std::convert::{From};
使用std::ops::{Add};
#[导出(调试)]
结构向量3{
x:T,
y:T,
z:T,
}
Vec3的impl From{
fn from(输入:Vec3)->Self{
Vec3{
x:input.x.into(),
y:将.y.输入()中,
z:将.z.输入()中,
}
}
}
Vec3的impl-Add
其中T:Add,U:Into
{
类型输出=Vec3;
fn add(self,rhs:U)->self::Output{
让rhs_转换为:Vec3=rhs.into();
Vec3{
x:self.x.add(rhs_.x),
y:self.y.add(rhs_.y),
z:self.z.add(rhs_.z),
}
}
}
fn main(){
设u:Vec3=Vec3{x:1,y:2,z:3};
设v:Vec3=Vec3{x:2,y:3,z:4};
设w=u+v;
println!(“{:?}”,w);//按预期打印“Vec3{x:3,y:5,z:7}”
}

您需要在
添加
实现中将
U:Into
更改为
U:Into
。此外,泛型
impl
中缺少类型参数
U
声明,它应该是
impl
而不仅仅是
impl
。在这些次要修复之后,您的代码将按预期工作:

使用std::convert::{From};
使用std::ops::{Add};
#[导出(调试)]
结构向量3{
x:T,
y:T,
z:T,
}
Vec3的impl From{
fn from(输入:Vec3)->Self{
Vec3{
x:input.x.into(),
y:将.y.输入()中,
z:将.z.输入()中,
}
}
}
Vec3的impl-Add
其中T:Add,U:Into
{
类型输出=Vec3;
fn add(self,rhs:U)->self::Output{
让rhs_转换为:Vec3=rhs.into();
Vec3{
x:self.x.add(rhs_.x),
y:self.y.add(rhs_.y),
z:self.z.add(rhs_.z),
}
}
}
fn main(){
设u:Vec3=Vec3{x:1,y:2,z:3};
设v:Vec3=Vec3{x:2,y:3,z:4};
设w=u+v;
println!(“{:?}”,w);//按预期打印“Vec3{x:3,y:5,z:7}”
}

请注意,自动类型转换不被视为惯用生锈,在语言及其标准库中故意避免。请注意,自动类型转换不被视为惯用生锈,在语言及其标准库中故意避免使用和。这允许
u+v
,但不允许
v+u
,这不容易用此实现添加。@mcarton可以用其他实现轻松添加它吗?这允许
u+v
,但不允许
v+u
,此实现无法轻松添加。@mcarton是否可以轻松添加其他实现?