目前,我正在尝试在任何实现私有跟踪的结构上全面实现公共特征,但我收到编译器警告: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);
}
或者PrivateTrait
mod_b
保密
trait PublicTrait {}
mod mod_b {
use crate::PublicTrait;
trait PrivateTrait {}
impl<T: PublicTrait> PrivateTrait for T {}
}
fn main() {}
我有两种方式实现了这一点:在同一模块中使用trait
之外的私有fn
(就像在 JavaScript 中所做的那样(;以及在同一模块中使用私有trait
和pub 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
。