如何在 Rust 中编写一个通用函数来接受任何实现特定属性的结构?

tur*_*tle 2 rust

我试图理解 Rust 中的泛型,并尝试编写一个泛型函数,该函数可以将任何具有该属性的结构foo乘以 10。当我使用此代码时,我收到错误no field foo on type T

struct A {
    foo: i8,
    bar: String,
}

struct B {
    foo: i8,
}

fn go<T>(v: T) {
    v.foo * 10
}

fn main() {
  let a = A {foo: 1, bar: "bar".to_string()};
  let b = B {foo: 2};
  println!("{:?},{:?}", go(a), go(b))
}
Run Code Online (Sandbox Code Playgroud)

如何编写一个可以接受任何实现foo: i8属性的结构的通用函数?

bk2*_*204 8

Rust 没有像 JavaScript 那样的属性,所以你需要做一些不同的事情。您需要使用特征将foo功能公开为方法,然后为A和实现该特征B

trait Foo {
    fn foo(&self) -> i8;
}

struct A {
    foo: i8,
    bar: String,
}

impl Foo for A {
    fn foo(&self) -> i8 {
        self.foo
    }
}

struct B {
    foo: i8,
}

impl Foo for B {
    fn foo(&self) -> i8 {
        self.foo
    }
}

fn go<T: Foo>(v: T) -> i8 {
    v.foo() * 10
}

fn main() {
    let a = A {
        foo: 1,
        bar: "bar".to_string(),
    };
    let b = B { foo: 2 };
    println!("{:?},{:?}", go(a), go(b))
}
Run Code Online (Sandbox Code Playgroud)

(请注意,我还在go上面返回了一个值。)

这提供了一个公开为方法的Foo特征,为和实现它,然后使require实现。这是实现这一目标最简单、最直接的方法。fooABgoTFoo