我正在尝试将一个拆分impl为不同的模块。子impl块中的项应可由父级访问impl,但实现的struct / enum用户不能公开访问。
这是我的尝试:
mod foo {
pub struct Foo {
field: String
}
impl Foo {
pub fn new() -> Foo {
Foo { field: "Joe".to_string() }
}
pub fn pubfn(&self) {
self.my_impl();
}
}
// Ideally, this should be in a separate file
mod foo_impl_details {
impl super::Foo {
// If I make this `pub`, it will be publicly visible to
// users of `Foo`, not just the impl block in `super`
fn my_impl(&self) {
println!("{} reporting for duty!", self.field);
}
}
}
}
fn main() {
let foo = foo::Foo::new();
foo.pubfn();
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译错误:
<anon>:11:13: 11:27 error: method `my_impl` is private
<anon>:11 self.my_impl();
^~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
如果用标记该my_impl方法pub,则不仅可以公开给父模块的impl块,而且还可以公开访问foo::Foo,这不是我想要的。
这有效。
mod foo {
use self::extension::Extension;
pub struct Foo {
field: String
}
impl Foo {
pub fn new() -> Foo {
Foo { field: "Joe".to_string() }
}
pub fn pubfn(&self) {
self.my_impl();
}
}
mod extension {
pub trait Extension {
fn my_impl(&self);
}
impl Extension for super::Foo {
fn my_impl(&self) {
println!("{} reporting for duty!", self.field);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来有点像预期的行为:该my_impl方法是私有的,因此仅在声明它的模块内可见。另一方面,奇怪的是,尽管该版本是私有模块pub,但它在任何地方都可见。foo_impl_details我对此提交了#16398 。
您可以将模块(以及文件,因为与或中的代码mod foo { ... }相同)分开,同时通过使用独立函数来维护隐私,例如mod foo;foo.rsfoo/mod.rs
mod foo {
pub struct Foo {
field: String
}
impl Foo {
pub fn new() -> Foo {
Foo { field: "Joe".to_string() }
}
pub fn pubfn(&self) {
foo_impl_details::my_impl(self);
}
}
mod foo_impl_details {
fn my_impl(x: &super::Foo) {
println!("{} reporting for duty!", x.field);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了调用语法之外,独立函数和方法之间没有任何区别。
此外,编写与类型声明不相邻的非特征实现会存在各种问题,因此这种行为可能不是设计使然的,例如
因此,有一个 RFC用于(暂时)删除此功能。
| 归档时间: |
|
| 查看次数: |
1959 次 |
| 最近记录: |