2016-12-26 12 views
3

У меня есть реализация для общедоступной черты, которая повторяет некоторую работу над несколькими функциями, поэтому я хотел бы DRY ее с помощью функции, которая выполняет общую работу, которая будет вызвана из функций, которые на самом деле предназначены для использования. Поэтому у меня есть:Есть ли способ иметь частные функции в общедоступных чертах?

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

Я не хочу do_private_thing() выставляться в документации или использовать непосредственно, потому что он ничего полезного из не делать перспектива пользователя признака/реализации. Но функции в публичных чертах не являются частными.

Я мог бы сделать do_private_thing частной функцией в модуле, где реализована реализация признака, но этот признак требует выполнения этой функции любой реализацией этого признака. Поэтому я чувствую, что немного лежу, если я оставлю этот код вне реализации.

Какой разумный способ проложить это в ржавчине?

+1

[mcve] может быть здорово понять, чего вы хотите. – Stargateur

+0

@Stargateur Но это до любой конкретной реализации. Я спрашиваю, что такое мышление вообще. Что будет здесь MCVE, но куча фигурных фигурных скобок и ключевые слова 'impl' /' trait'? –

+0

Ну, я новичок в ржавчине, но у меня есть некоторые навыки в разработке API. Я не уверен, что понял часть ржавчины этого вопроса. [Mcve] может помочь мне лучше понять часть ржавчины. Потому что этот вопрос, вероятно, больше связан с дизайном. Может быть, вы могли бы предоставить «псевдокод»? – Stargateur

ответ

2

Я мог бы сделать do_private_thing частной функции в модуле, где реализация черта находится

Это то, что я хотел бы сделать.

, но черта требует, чтобы работа этой функции выполнялась любой реализацией признака. Поэтому я чувствую, что немного лежу, если я оставлю этот код вне реализации.

Это начинает быть немного менее ясным. Когда вы говорите любую реализацию признака, я больше не понимаю, почему вы хотите сделать его приватным. Если другому исполнителю этого признака нужен этот код, тогда он должен быть публичным в некотором роде.

Во многом это кажется очень похожим на вопрос «как мне проверять частные методы». Мой обычный ответ: не. Вместо этого извлеките код, который хотите протестировать, на новый общедоступный элемент, а затем проверьте элемент отдельно. Обычная проблема заключается в том, что люди не хотят раскрывать функциональность по определенному фрагменту состояния, а не то, что они вообще не хотят раскрывать функциональность.

В этом случае создайте новый тип, включающий общую логику, и затем его можно будет открыть и использовать тем, кто в нем нуждается. Кроме того, создайте тип, который может быть параметризован типом, реализующим вашу черту, и предоставляет вам любую дополнительную функциональность.