是否建议使用特征来实现外部箱中结构的实用功能?

时间:2016-06-18 07:29:23

标签: rust

我想在Rust中实现一个简单的实用程序/辅助函数。该函数只是连接结构中的路径(来自外部包)和传递的参数。将辅助函数作为普通函数或自定义特征的函数实现更为惯用吗?

基于特质的方法的实施:

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)
}

基于特征的方法在使用辅助函数时缩短了代码,但我担心它可能会导致难以理解它的定义。

虽然两种实现都应该有效,但我想知道Rust中推荐哪种方式。

1 个答案:

答案 0 :(得分:2)

免责声明:我对此并不完全确定。如果这个答案收到足够的'upvotes,我将删除此免责声明)

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

但是,由于这些优势,我说使用Ext - 特质方法通常是一个稍好的选择

  • 许多操作感觉更自然地调用"对象" (使用点符号)而不是用两个对象调用函数。
  • 链接多个调用在代码中看起来不错,因为它适合我们从左到右的阅读方式,而使用函数方法代码更难阅读:f(f(a, f(d, e)), c)
  • 如果用户更喜欢普通功能样式,他也可以Trait::func(self_object, arg)使用它。

但当然有一些缺点(你已经提到了一个):

  • 用户更难理解帮助函数的定义位置。
  • 用户需要具有范围内的特征(阅读:use特征)。