我正在try 创建一个 struct ,它将包含所有其他 struct 中存在的基本函数,如下所示:

pub struct GenericSelect {
    table: String,
    distinct: bool,
    columns: Option<String>,
    group: Option<String>,
    order: Option<String>,
    limit: Option<u32>,
    offset: Option<u32>,
}

impl GenericSelect {
    pub fn new<T: Into<String>>(table: T) -> GenericSelect {
        GenericSelect {
            table: table.into(),
            distinct: false,
            columns: None,
            group: None,
            order: None,
            limit: None,
            offset: None,
        }
    }

    pub fn distinct(&mut self) -> &mut Self {
        self.distinct = true;
        self
    }

    pub fn columns<T: Into<String>>(&mut self, columns: T) -> &mut Self {
        self.columns = Some(columns.into());
        self
    }

    pub fn group<T: Into<String>>(&mut self, group: T) -> &mut Self {
        self.group = Some(group.into());
        self
    }

    pub fn order<T: Into<String>>(&mut self, order: T) -> &mut Self {
        self.order = Some(order.into());
        self
    }

    pub fn limit(&mut self, limit: u32) -> &mut Self {
        self.limit = Some(limit);
        self
    }

    pub fn offset(&mut self, offset: u32) -> &mut Self {
        self.offset = Some(offset);
        self
    }

    pub fn build(&self) -> String {
        let mut statement = String::from("SELECT");

        if self.distinct {
            statement.push_str(" DISTINCT");
        }

        if let Some(columns) = &self.columns {
            statement.push_str(&format!(" {}", columns));
        } else {
            statement.push_str(" *");
        }

        statement.push_str(&format!(" FROM {}", self.table));

        if let Some(group) = &self.group {
            statement.push_str(&format!(" GROUP BY {}", group));
        }

        if let Some(order) = &self.order {
            statement.push_str(&format!(" ORDER BY {}", order));
        }

        if let Some(limit) = &self.limit {
            statement.push_str(&format!(" LIMIT {}", limit));
        }

        if let Some(offset) = &self.offset {
            statement.push_str(&format!(" OFFSET {}", offset));
        }

        statement.push(';');
        statement
    }
}

我想要一个特定的 struct 来拥有这个 struct 所拥有的一切,而不需要逐个方法地编写方法,我还希望有可能在必要时实现一个函数,比如更改特定函数的行为,等等.

推荐答案

trait 将会做你正在寻找的事情.

以下是《铁 rust 》文档中的例子:

pub trait Summary {
    fn summarize_author(&self) -> String;

    fn summarize(&self) -> String {
        format!("(Read more from {}...)", self.summarize_author())
    }
}

这是描述共享行为的模板.当您希望 struct 参与这种共享行为时,可以在其上编写一个Iml,至少编写所需的功能

impl Summary for Tweet {
    fn summarize_author(&self) -> String {
        format!("@{}", self.username)
    }
}

在特征中,您可以使用默认实现summarize的函数.然后,指定像summarize_author这样的函数,为您的默认实现提供一些跨 struct 的标准接口.

如果您想覆盖SUMMARY函数,您可以在impl:

impl Summary for Tweet {
    fn summarize_author(&self) -> String {
        format!("@{}", self.username)
    }

    fn summarize(&self) -> String {
        format!("(More about this tweet by {})...", self.summarize_author())
    }
}

来源:https://doc.rust-lang.org/book/ch10-02-traits.html

Rust相关问答推荐

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

在HashMap中插入Vacant条目的可变借位问题

使用元组执行条件分支的正确方法

如何在Rust中实现Functor trait?

从特征实现调用函数的Rust惯用方法

修改切片/引用数组

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

如何用Axum/Tower压缩Html内容?

是否可以使用Rust宏来构建元组的项?

try 创建随机数以常量

允许 rust 迹 struct 条目具有多种类型

为什么实现特征的对象期望比具体对象有更长的生命周期?

Boxing 如何将数据从堆栈移动到堆?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

Rust 打包在 .deb 中

bcrypt 有长度限制吗?

rust tokio::spawn 在 mutexguard 之后等待

在 Rust 中,将可变引用传递给函数的机制是什么?

如何将切片推入数组?

传递 Option<&mut T> 时何时需要 mut