【问题标题】:Is there a way to have private functions in public traits?有没有办法在公共特征中具有私有功能?
【发布时间】:2016-12-26 04:54:58
【问题描述】:

我有一个公共特征的实现,它在多个函数上重复一些工作,所以我想用一个完成共享工作的函数来干掉它,从实际打算使用的函数中调用。所以我有:

  • fn do_private_thing()
  • fn do_pub_1()
  • fn do_pub_2()

我不希望 do_private_thing() 在文档中公开或直接使用,因为从特征/实现用户的角度来看,它没有做任何有用的事情。但是公共特征中的函数不是私有的。

我可以在 trait 实现所在的模块中将 do_private_thing 设为私有函数,但该 trait 确实要求该函数的工作由该 trait 的任何实现完成。因此,如果我将代码排除在实现之外,我觉得我有点撒谎。

在 Rust 中进行布局的合理方式是什么?

【问题讨论】:

  • minimal reproducible example 可以很好地了解您想要什么。
  • @Stargateur 但这是在任何特定实现之前。我问的是一般的想法是什么。这里的 MCVE 会是什么,但是一堆花括号和 impl / trait 关键字?
  • 好吧,我是 rust 的新手,但我有一些 API 设计技能。我不确定是否理解这个问题的生锈部分。 minimal reproducible example 可以帮助我更好地理解生锈部分。因为这个问题可能更多是关于设计的。也许你能提供一个“伪代码”?

标签: module rust private traits


【解决方案1】:

我可以在 trait 实现所在的模块中将 do_private_thing 设为私有函数

这就是我会做的。

但该 trait 确实要求该函数的工作由该 trait 的任何实现来完成。因此,如果我将代码排除在实现之外,我觉得我有点撒谎。

这开始有点不太清楚了。当您说特征的任何实现时,我不再明白您为什么要将其设为私有。如果 trait 的另一个实现者需要此代码,那么它应该以某种方式公开。

在很多方面,这与“我如何测试私有方法”的问题非常相似。我的正常回答是:不要。相反,将要测试的代码提取到新的公共项目中,然后单独测试该项目。通常的问题是人们不想在特定状态上公开功能,而不是他们根本不想公开该功能。

在这种情况下,创建一个包含共享逻辑的新类型,然后任何需要它的人都可以公开和使用它。或者,创建一个类型,该类型可以通过实现您的 trait 的类型进行参数化,并提供您需要的任何额外功能。

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 2014-10-07
    • 1970-01-01
    • 2017-03-24
    • 2017-03-10
    • 2012-06-19
    • 1970-01-01
    • 2022-01-04
    • 2011-04-22
    相关资源
    最近更新 更多