2016-12-26 67 views
3

我有一个公共特性的实现,它重复了一些关于多个函数的工作,所以我想用一个执行共享工作的函数干掉它,从实际上要使用的函数中调用它。所以,我有:有没有办法在公共性状中拥有私人功能?

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

我不想do_private_thing()在文档被曝光或直接使用,因为它没有做任何事情,从有用该特征/实现的用户的视角。但公共特征的功能不是私人的。

我可以让do_private_thing是模块中的一个私有函数,但特性确实要求该函数的工作是通过特征的任何实现来完成的。所以我觉得如果我把这些代码从实现中解脱出来,我就会说谎一点点。

在Rust中展示出来的合理方法是什么?

+1

[mcve]可能很好理解你想要什么。 – Stargateur

+0

@Stargateur但是这在任何特定实现之前。我在问一般的想法是什么。这里的MCVE会是什么,但是大量的大括号和'impl' /'trait'关键字? –

+0

嗯,我是一个生锈的新手,但我有一些API设计技巧。我不确定是否了解这个问题的生锈部分。 [mcve]可以帮助我更好地理解生锈的部分。因为这个问题可能更多关于设计。也许你能提供一个“伪代码”? – Stargateur

回答

2

我可以让do_private_thing其中性状实现位于

这是我会做的模块中的私有函数。

但特性确实要求该功能的工作是通过任何特性的实现来完成的。所以我觉得如果我把这些代码从实现中解脱出来,我就会说谎一点点。

这开始有点不太清楚。当你说任何特性的实现,那么我不再理解为什么你想要它是私人的。如果这个特征的另一个实现者需要这个代码,那么它应该以某种方式公开。

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

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

相关问题