首页 > 解决方案 > 将函数添加到预先存在的结构

问题描述

我想将自己的函数添加到我无法控制的预先存在的结构中。作为具体的例子,我想创建一个实例std::fs::File

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

然后我想以某种方式创建自己的功能fn foo(),以便以后可以做logfile.foo();

老实说,我不确定这是否可能。

标签: functionfilestructrust

解决方案


这正是特征可以用来做的事情。请参阅 Rust 书中的“特征:定义共享行为”。

简而言之,您可以定义自己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();
}

推荐阅读