相关疑难解决方法(0)

--release 的恐慌!()和期望()的替代品?

在开发中,我的代码使用.expect()panic!()来处理致命错误。

他们的行为正是我在开发过程中所需要的。

当我使用 进行编译时--release,我希望它们的输出会变得更加简洁。

即这段代码:

let mut file_a = OpenOptions::new().write(true)
                                   .read(true)
                                   .open(args.file_a).expect("foo bar");
Run Code Online (Sandbox Code Playgroud)

生成:

thread 'main' panicked at 'foo bar: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/bin/vsapply.rs:131:59
Run Code Online (Sandbox Code Playgroud)

当我只想:

foo bar: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当用--release.

已经有办法做到这一点了吗?

panic rust

8
推荐指数
2
解决办法
1954
查看次数

如何重新定义宏?

在C++中,您可以取消定义并重新定义宏.例如,视频游戏中常见的事情是在发布模式下将日志记录宏重新定义为空.这可以保证代码完全消失,从而有助于提高性能.

有没有办法在Rust做类似的事情?

rust

4
推荐指数
1
解决办法
534
查看次数

Rust:带有 lib 和二进制目标的板条箱中的属性 #[cfg(test)]

我目前正在研究一个Rust 项目,该项目有一个库目标和一个二进制目标。

该库定义了两种恐慌处理程序,一种用于生产使用,另一种用于测试,它们使用 #[cfg(test)] 属性进行条件编译。这对于单元测试 src/lib.rs 来说效果很好,但是一旦在tests/(或 src/main.rs)中进行集成测试,“生产”恐慌处理程序就会被链接到,即在这些情况下,lib。 rs 使用 test=false 进行编译。

有什么方法可以防止/配置它吗?

使用以下目录结构可以最低程度地重现这一点:

Cargo.toml
src/lib.rs
src/main.rs
Run Code Online (Sandbox Code Playgroud)

清单如下所示:

# Cargo.toml
...
[lib]
name = "kernel"

[[bin]]
path = "src/main.rs"
name = "titanium"
Run Code Online (Sandbox Code Playgroud)

二进制代码:

// main.rs

fn main() {
    println!("Hello, world!");
}

#[test]
fn it_works() {
    assert_eq!(kernel::hello(), "Hello!".to_string());
}
Run Code Online (Sandbox Code Playgroud)

...对于图书馆:

// lib.rs

#[cfg(test)]
pub fn hello() -> String {
    "Hello!".to_string()
}

#[cfg(not(test))]
pub fn hello() -> String {
    "Goodbye!".to_string()
}

#[test]
fn it_works() {
    assert_eq!(hello(), "Hello!".to_string())
}
Run Code Online (Sandbox Code Playgroud)

回答 事实上,上述行为对于大约 …

testing conditional-compilation rust rust-cargo

2
推荐指数
1
解决办法
1520
查看次数

仅当处于发布模式时,我将如何运行没有窗口的 Rust 程序

我有一个 Rust 项目,我目前正在处理,我经常需要调试和部署它。虽然它已部署,但它在没有窗口的情况下在后台运行,但是当我调试时,我想要一个窗口来查看是否有任何运行时错误。

我目前#![windows_subsystem = "windows"]在调试时使用并注释掉它,但是程序本身有没有办法检查它是否处于调试模式,因此它不使用该标志?

rust

1
推荐指数
1
解决办法
50
查看次数