Rod*_*igo 4 visibility traits rust
假设我在图书馆中有以下特征:
pub trait Foo {
fn public_op(&self);
fn internal_op(&self);
}
Run Code Online (Sandbox Code Playgroud)
然后针对该库中的一堆结构实现此特征:
pub struct One {}
impl Foo for One {
fn public_op(&self) {}
fn internal_op(&self) {}
}
pub struct Two {}
impl Foo for Two {
fn public_op(&self) {}
fn internal_op(&self) {}
}
Run Code Online (Sandbox Code Playgroud)
这个库中有一个接收特征类型的公共函数:
pub fn process(obj: &dyn Foo) {
obj.public_op();
obj.internal_op();
}
Run Code Online (Sandbox Code Playgroud)
问题是,由于Foo特征在库中是公共的,因此该方法internal_op也是公共的......但实际上它应该具有pub(crate)可见性,因为它必须仅在库内部使用。
据我所知,一个特质的所有方法都是公共的,那么我该如何重新设计这个问题呢?
您可以分为Foo两种特征,一种是公共的,一种是私人的。
pub trait Foo: private::Foo {
fn public_op(&self);
}
pub(crate) mod private {
pub trait Foo {
fn internal_op(&self);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将它们都实现在您的库箱中,如下所示:
pub struct One {}
impl Foo for One {
fn public_op(&self) {}
}
impl private::Foo for One {
fn internal_op(&self) {}
}
Run Code Online (Sandbox Code Playgroud)
然后从库箱外部使用将如下所示:
fn main() {
let one = One {};
one.public_op(); // works
process(&one); // works
//one.internal_op(); // error[E0599]: no method named `internal_op`...
}
Run Code Online (Sandbox Code Playgroud)
这确实意味着您的库的用户不可能实现现在Foo实际上Foo是“密封特征”的功能。
有关此方法和替代方法的讨论,请参阅 Jack Wrenn 的博客文章。