Rust 是否建议使用traits为外部板条箱中的结构实现实用功能?

Rust 是否建议使用traits为外部板条箱中的结构实现实用功能?,rust,Rust,我想在Rust中实现一个简单的实用程序/助手函数。该函数只是将结构中的路径(来自外部板条箱)与传递的参数连接起来。将helper函数实现为普通函数还是自定义特性函数更为惯用 基于特征的方法的实施: use std::path::{Path, PathBuf}; pub trait RepositoryExt { fn get_full_path(&self, path_in_repository: &Path) -> PathBuf; } impl Reposi

我想在Rust中实现一个简单的实用程序/助手函数。该函数只是将结构中的路径(来自外部板条箱)与传递的参数连接起来。将helper函数实现为普通函数还是自定义特性函数更为惯用

基于特征的方法的实施:

use std::path::{Path, PathBuf};

pub trait RepositoryExt {
    fn get_full_path(&self, path_in_repository: &Path) -> PathBuf;
}

impl RepositoryExt for othercrate::Repository {
    // othercrate::Repository's workdir() returns its path
    fn get_full_path(&self, path_in_repository: &Path) -> PathBuf {
        self.workdir().join(path_in_repository)
    }
}
仅使用一个函数:

pub fn get_repository_full_path(repo: othercrate::Repository,
                                path_in_repository: &Path) -> PathBuf {
    repo.workdir().join(path_in_repository)
}
基于特征的方法在使用helper函数时缩短了代码,但我担心这可能会给理解它的定义带来困难

虽然这两种实现都应该可以工作,但我想知道在Rust中哪种是推荐的方法。

(免责声明:我不完全确定这一点。如果这个答案足够的话™ 以上投票,我将删除此免责声明)


好问题!我已经在野外看到了这两种解决方案,可以说这两种方法都是有效的。或者换句话说:这两种解决方案都不被认为是坏的

然而,我认为使用
Ext
-trait方法通常是稍微好一点的选择,因为有以下优点:

  • 许多操作感觉调用“一个对象”(用点表示法)比调用两个对象的函数更自然
  • 链接多个调用在代码中看起来不错,因为它适合我们从左到右的阅读方式,而使用函数方法,代码更难阅读:
    f(f(a,f(d,e)),c)
  • 如果用户更喜欢普通函数样式,也可以将其与
    Trait::func(self\u object,arg)
    一起使用
但当然也有一些缺点(您已经提到了一个):

  • 用户更难理解helper函数的定义位置
  • 用户需要在范围内具有特征(阅读:
    use
    thetrait)
我非常肯定这些“缺点”会(故意)相互抵消。你知道函数是在哪里定义的,因为你可能必须考虑要包含哪些特征。我对这个特性最大的烦恼是你必须输入两次(一次用于特性,一次用于impl)。