2016-12-26 60 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其中性狀實現位於

這是我會做的模塊中的私有函數。

但特性確實要求該功能的工作是通過任何特性的實現來完成的。所以我覺得如果我把這些代碼從實現中解脫出來,我就會說謊一點點。

這開始有點不太清楚。當你說任何特性的實現,那麼我不再理解爲什麼你想要它是私人的。如果這個特徵的另一個實現者需要這個代碼,那麼它應該以某種方式公開。

在很多方面,這與「如何測試私人方法」這個問題非常相似。我的正常答案是:不要。相反,將要測試的代碼提取到新的公共項目,然後單獨測試項目。通常的問題是,人們不想在特定的狀態上公開功能,而不是他們不想公開功能。

在這種情況下,創建一個包含共享邏輯的新類型,然後可以由需要它的任何人暴露和使用。或者,創建一個可以通過實現您的特徵的類型進行參數化的類型,並提供您需要的任何額外功能。

相關問題