Rust 是否建议使用traits为外部板条箱中的结构实现实用功能?
我想在Rust中实现一个简单的实用程序/助手函数。该函数只是将结构中的路径(来自外部板条箱)与传递的参数连接起来。将helper函数实现为普通函数还是自定义特性函数更为惯用 基于特征的方法的实施: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
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函数的定义位置
- 用户需要在范围内具有特征(阅读:
thetrait)use