Rust &引用;在当前范围内找不到类型T的方法;包装字体时
我试图围绕两种不同类型的适配器来完成相同的工作,但我无法重写这两种类型Rust &引用;在当前范围内找不到类型T的方法;包装字体时,rust,adapter,Rust,Adapter,我试图围绕两种不同类型的适配器来完成相同的工作,但我无法重写这两种类型 X有一个消耗self的方法,因此运行时多态包装器不适用。唯一的选择是静态通用方法 struct X {} impl X { fn f(self, n: i32) { println!("n = {}", n); } fn new() -> X { X {} } } struct AdapterX { x: X } impl AdapterX
X
有一个消耗self
的方法,因此运行时多态包装器不适用。唯一的选择是静态通用方法
struct X {}
impl X {
fn f(self, n: i32) {
println!("n = {}", n);
}
fn new() -> X {
X {}
}
}
struct AdapterX {
x: X
}
impl AdapterX {
fn uf(self, n: i32) {
self.x.f(n)
}
fn new(x: X) -> AdapterX {
AdapterX { x: x }
}
}
fn useAdapted<T>(a: T) {
a.uf(10)
}
fn main() {
let x = X::new();
useAdapted::<AdapterX>(AdapterX::new(x));
}
我能把它弄明白;不需要包装器结构。正确的方法是一种普遍的特征。我还错过了泛型类型变量的类型范围
struct X {}
impl X {
fn f(self, n: i32) {
println!("n = {}", n);
}
fn new() -> X {
X {}
}
}
trait Adapter<T> {
fn uf(self, n: i32);
}
impl Adapter<X> for X {
fn uf(self, n: i32) {
self.f(n)
}
}
struct Y {}
impl Y {
fn g(self, n: f32) {
println!("m = {}", n);
}
fn new() -> Y {
Y {}
}
}
impl Adapter<Y> for Y {
fn uf(self, n: i32) {
self.g(n as f32)
}
}
fn use_adapted<A, T: Adapter<A>>(a: T) {
a.uf(10)
}
fn main() {
use_adapted(X::new());
use_adapted(Y::new());
}
struct X{}
implx{
fn f(自我,n:i32){
println!(“n={}”,n);
}
fn new()->X{
X{}
}
}
特征适配器{
fn-uf(self,n:i32);
}
用于X的impl适配器{
fn uf(自我,n:i32){
self.f(n)
}
}
结构Y{}
简单的{
fn g(自我,n:f32){
println!(“m={}”,n);
}
fn new()->Y{
Y{}
}
}
用于Y的impl适配器{
fn uf(自我,n:i32){
self.g(n为f32)
}
}
fn使用自适应(a:T){
a、 uf(10)
}
fn main(){
使用_-adapted(X::new());
使用_-adapted(Y::new());
}
问题在于:
fn useAdapted<T>(a: T) {
a.uf(10)
}
fn使用自适应(a:T){
a、 uf(10)
}
这是说
给我任何可能的类型,我将调用uf
方法
这显然是胡说八道,因为您可以传入字符串
或bool
或HashMap
或文件
或。。。。(你明白了)
没有方法uf
适用于每个类型,因此编译器会告诉您。正如您所发现的,您必须为泛型类型提供一个具有一个或多个特征的绑定。这些特性中的方法和相关函数将在方法内部可用
还请注意,锈蚀类型为“蛇壳”;应该调用函数
use_adapted
如何设置此绑定?@mjwrazor如果向下滚动一点,就会看到。