我试图理解 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属性的结构的通用函数?
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
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |