向现有结构体添加函数

4

我想将自己的函数添加到一个现有的结构体中,但这个结构体不在我的控制之下。具体例子是我想创建一个 std::fs::File 实例。

let logfile = std::fs::OpenOptions::new().create(true).open("file.txt").unwrap();

我希望能够创建自己的函数fn foo(),以便之后可以使用logfile.foo();。但说实话,我不确定这是否可行。


你的实例中是否有 foo 所依赖的特殊信息,或者所有信息都已经在 File 实例中了?如果所有信息都已经在 File 实例中,那么你可以简单地创建一个带有 foo 方法的 trait,然后为 File 实现它。 - Aplet123
1个回答

7
这正是 trait 可以用来做的事情。请查看 Rust 书中的 "Traits: Defining Shared Behavior"。
简而言之,您可以定义自己的 trait Foo 并添加例如 fn foo(&self) 方法,然后 impl Foo for std::fs::File,这使您能够调用 logfile.foo()
trait Foo {
    fn foo(&self);
}

impl Foo for File {
    fn foo(&self) {
        println!("foo");
    }
}

此外,您的 OpenOptions 中缺少对 write()append() 的调用。否则,您将收到一个 InvalidInput 错误。

这是一个完整的示例:

use std::fs::{File, OpenOptions};

trait Foo {
    fn foo(&self);
}

impl Foo for File {
    fn foo(&self) {
        println!("foo");
    }
}

fn main() {
    let logfile = OpenOptions::new()
        .write(true) // or `.append(true)`
        .create(true)
        .open("file.txt")
        .unwrap();

    logfile.foo();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接