Функция not_really_public_interface
является общедоступной, поэтому она может использоваться любым другим модулем.Но структура Private
может быть доступна только вашим корневым и inner
модулям.
Утечка произошла бы, если бы другой модуль импортировал not_really_public_interface
.Rust жалуется, что это могло бы произойти, потому что оно сообщает об ошибках локально, а не рассматривает весь мир во всех случаях использования во всех модулях и ящиках.В конечном счете, этот подход более предсказуем для людей и позволяет быстрее рассуждать о машине.
Rust позволяет более точно контролировать видимость.Если вы скажете ему, что функция only доступна для модуля на один уровень выше (модуль super
), то он узнает, что утечки нет:
mod inner {
use super::Private;
pub(super) fn not_really_public_interface() -> Private { Private }
}
Youможно также использовать crate
вместо super
, чтобы обозначать любой модуль в том же ящике.Или, если у супер-модуля есть имя, например, my_mod
, вы можете использовать pub(in ::my_mod)
, чтобы указать его конкретно.