gpt4 book ai didi

rust - 是否建议使用 traits 为外部 crate 中的结构实现实用函数?

转载 作者:行者123 更新时间:2023-11-29 08:07:56 26 4
gpt4 key购买 nike

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

基于特征的方法的实现:

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 中推荐的方式。

最佳答案

(免责声明:我对此并不完全确定。如果这个答案收到足够多的™赞成票,我将删除此免责声明)


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

但是,我认为使用 Ext-trait 方法通常是更好的选择,因为有以下优点:

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

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

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

关于rust - 是否建议使用 traits 为外部 crate 中的结构实现实用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com