gpt4 book ai didi

rust - 如何在库中使用 pub(crate) 方法具有公共(public)特征?

转载 作者:行者123 更新时间:2023-12-05 02:43:46 24 4
gpt4 key购买 nike

假设我在库中有以下特征:

pub trait Foo {
fn public_op(&self);
fn internal_op(&self);
}

然后为这个库中的一堆结构实现了这个特性:

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) {}
}

并且这个库中有一个接收特征类型的公共(public)函数:

pub fn process(obj: &dyn Foo) {
obj.public_op();
obj.internal_op();
}

问题在于,由于 Foo 特征在库中是公开的,方法 internal_op 也是公开的...但实际上它应该有 pub (crate) 可见性,因为它只能在库内使用。

据我所知,一个特征的所有方法都是公开的,那么我该如何重新设计这个问题?

最佳答案

您可以将 Foo 分成两个特征,一个是公共(public)的,一个是私有(private)的。

pub trait Foo: private::Foo {
fn public_op(&self);
}

pub(crate) mod private {
pub trait Foo {
fn internal_op(&self);
}
}

然后在你的库 crate 中实现它们,如下所示:

pub struct One {}

impl Foo for One {
fn public_op(&self) {}
}

impl private::Foo for One {
fn internal_op(&self) {}
}

然后从库箱外使用看起来像:

fn main() {
let one = One {};
one.public_op(); // works
process(&one); // works

//one.internal_op(); // error[E0599]: no method named `internal_op`...
}

这确实意味着您的库的用户不可能实现 Foo,因为 Foo 现在实际上是一个 'sealed trait' .

参见 Jack Wrenn 的 blog post讨论这种方法和替代方法。

Rust playground link

关于rust - 如何在库中使用 pub(crate) 方法具有公共(public)特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66786429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com