有没有办法让公共特征具有私人功能?

bri*_*tar 5 module private traits rust

我有一个公共特征的实现,它重复了一些关于多个函数的工作,所以我想用一个执行共享工作的函数来干掉它,从实际意图使用的函数中调用它.所以我有:

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

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

我可以do_private_thing在特征实现所在的模块中创建一个私有函数,但特征确实需要该特性的任何实现都能完成该函数的工作.所以,如果我将该代码留在实现之外,我觉得我有点撒谎.

什么是在Rust中解决这个问题的合理方法?

She*_*ter 6

我可以do_private_thing在 trait 实现所在的模块中创建一个私有函数

这就是我要做的。

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

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

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

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