【问题标题】:Hack Rust Visibility and PrivacyHack Rust 可见性和隐私
【发布时间】:2021-02-14 20:52:56
【问题描述】:

我尝试使用来自不使用 pub 密钥的外部 crate 中的 struct

我想最好的解决办法是打开一个 PR,但我的好奇心在这里被激发了。

在 C++ 中,这很容易。我们可以这样做:

#define private public
#include <...> // import public as public AND also private as public
#undef private

这会在解析代码时欺骗编译器,因此我们可以访问类的所有方法/字段。

对 Rust 有什么想法吗?

这是一个具体的例子:

use warp::{
    compression::{Compression, internal::CompressionProps},
    reply::Response,
};

pub enum CompressionAlgorithms {
    Brotli(Compression<dyn Fn(CompressionProps) -> Response>),
    Deflate(Compression<dyn Fn(CompressionProps) -> Response>),
    Gzip(Compression<dyn Fn(CompressionProps) -> Response>),
}

编译错误:error[E0603]: module `internal` is private - 在这个例子中,我们试图导入一个模块而不是一个结构......不确定它是否会改变任何东西。

不幸的是,如果我们不拥有箱子,the docs for error E0603 并没有真正的帮助。 the docs on visibility and privacy in the Rust Reference 也一样。

【问题讨论】:

    标签: rust class-visibility


    【解决方案1】:

    对 Rust 有什么想法吗?

    如果一个箱子没有暴露什么东西,那么那个东西就不适合你使用。这可能是一个疏忽,也可能是一个设计决定,这并不重要。

    编译错误:error[E0603]: module internal is private - 在这个例子中,我们试图导入一个模块而不是一个结构......不确定它是否会改变任何东西。

    没有。见鬼,命名方案实际上是在告诉您私有模块是内部细节,再清楚不过了,这很不适合您触摸。 CompressionProps was specifically made non-public.

    【讨论】:

    • 是的,这个例子可能并不完美。事实上,我的问题更像是寻找一种绕过 Rust 编译器类可见性的方法的挑战......即使它是一个肮脏和不安全的黑客,它忽略了任何设计决策。
    • 好吧,如果你不打算自己发布你的 crate,你总是可以克隆 crate 源,修改它们并使用本地副本作为依赖。除此之外 - 不,没有办法从依赖项修改依赖项的源代码。
    • 事实上,#include 就是这样做的。它扩展到包含文件的全部内容。
    • 这也是为什么 C++ 编译器必须一遍又一遍地重新解析相同的文件和chromium starts with 12 million LOCs but by the time it's done the compiler has gone through 3.6 billion LOCs
    • @Cerberus 你想把它变成答案吗?这确实是执行 OP 要求的唯一方法。
    猜你喜欢
    • 2014-03-06
    • 2012-05-10
    • 2023-03-20
    • 2013-06-13
    • 2014-08-11
    • 2013-06-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多