我想在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中推荐哪种方式。
答案 0 :(得分:2)
(免责声明:我对此并不完全确定。如果这个答案收到足够的'upvotes,我将删除此免责声明)
好问题!我已经在野外看到了这两种解决方案,并且会说两者都有效。换句话说:两种解决方案都不被认为是坏的。
但是,由于这些优势,我说使用Ext
- 特质方法通常是一个稍好的选择:
f(f(a, f(d, e)), c)
。Trait::func(self_object, arg)
使用它。但当然有一些缺点(你已经提到了一个):
use
特征)。