是否可以将展示广告拆分为不同的模块?

Att*_*ika 6 rust

我正在尝试将一个拆分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,这不是我想要的。

A.B*_*.B. 7

这有效。

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)


huo*_*uon 5

这看起来有点像预期的行为:该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用于(暂时)删除此功能。