公共接口中的私有特征,当一揽子将公共特征实现为私有特征时

  • 本文关键字:特征 实现 一揽子 接口 rust
  • 更新时间 :
  • 英文 :


目前,我正在尝试在任何实现私有跟踪的结构上全面实现公共特征,但我收到编译器警告:private trait `mod_b::PrivateTrait` in public interface (error E0445)有没有办法解决这个问题?

main.rs:

trait PublicTrait {}
mod mod_b
{
use PublicTrait;
trait PrivateTrait {}
impl<T: PrivateTrait> PublicTrait for T {}
}
pub fn main ()
{
}

您需要公开PrivateTrait

trait PublicTrait {}
mod mod_b {
use crate::PublicTrait;
pub trait PrivateTrait {}
impl<T: PrivateTrait> PublicTrait for T {}
}
fn test<T: PublicTrait>(_: T){
println!("public")
}
struct Private;
impl mod_b::PrivateTrait for Private {}
pub fn main() {
test(Private);
}

或者PrivateTraitmod_b保密

trait PublicTrait {}
mod mod_b {
use crate::PublicTrait;
trait PrivateTrait {}
impl<T: PublicTrait> PrivateTrait for T {}
}
fn main() {}

我有两种方式实现了这一点:在同一模块中使用trait之外的私有fn(就像在 JavaScript 中所做的那样(;以及在同一模块中使用私有traitpub trait。在这两种情况下,解决方案都涉及实现泛型并使用Sized约束。

私人fn

pub trait MyPublicTrait: Sized {
fn get_msg(&self) -> &str { "Hello from" }
fn do_something(&self) {
do_something_impl(self);
}
}
fn do_something_impl<T>(a: &T)
where T: MyPublicTrait
{
println!("{} private fn", a.get_msg());
}

私人trait

trait MyPrivateTrait {
fn do_something_impl(&self);
}
pub trait MyPublicTrait: Sized {
fn get_msg(&self) -> &str { "Hello from" }
fn do_something(&self) {
self.do_something_impl();
}
}
impl<T: MyPublicTrait> MyPrivateTrait for T {
fn do_something_impl(&self) {
println!("{} private trait", self.get_msg());
}
}

第二个起初对我来说似乎很困惑,因为MyPublicTrait在"知道"Self将始终实现MyPrivateTrait之前正在使用do_something_impl。但显然编译器知道我们想说什么:do_something_impl总是存在于任何MyPublicTrait,因为MyPrivateTrait是为所有T: MyPublicTrait实现的。反之亦然,get_msg可用于MyPrivateTrait,因为任何T都将始终是MyPublicTrait

并且从调用此模块之外的代码的角度来看,MyPrivateTrait中声明的方法将永远不可用,因为您无法use私有trait

最新更新