【问题标题】:How to concatenate static strings in Rust如何在 Rust 中连接静态字符串
【发布时间】:2016-05-11 11:45:43
【问题描述】:

我正在尝试连接静态字符串和字符串文字以构建另一个静态字符串。以下是我能想到的最好的方法,但它不起作用:

const DESCRIPTION: &'static str = "my program";
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
const VERSION_STRING: &'static str = concat!(DESCRIPTION, " v", VERSION);

在 Rust 中有什么方法可以做到这一点,还是我必须一遍又一遍地写相同的文字?

【问题讨论】:

  • @starblue 从自述文件中引用:“使用这个宏,可以有静态需要在运行时执行代码才能被初始化。”在我的示例中,不必在运行时执行任何代码。

标签: rust


【解决方案1】:

由于我本质上是在尝试模拟 C 宏,因此我尝试使用 Rust 宏解决问题并成功:

macro_rules! description {
    () => ( "my program" )
}
macro_rules! version {
    () => ( env!("CARGO_PKG_VERSION") )
}
macro_rules! version_string {
    () => ( concat!(description!(), " v", version!()) )
}

使用宏而不是常量感觉有点难看,但它可以按预期工作。

【讨论】:

    【解决方案2】:

    编译错误是

    错误:需要文字

    文字是您直接键入的任何内容,例如 "hello"5。当您开始使用常量时,您不再使用文字,而是使用标识符。所以现在你能做的最好的就是

    const VERSION_STRING: &'static str =
        concat!("my program v", env!("CARGO_PKG_VERSION"));
    

    由于env! 宏扩展为文字,您可以在concat! 中使用它。

    【讨论】:

    • 所以,正如我所担心的那样,我将不得不一遍又一遍地写同样的文字。
    • 您可以随时尝试改进concat 宏以支持常量;)但它需要一个月左右才能稳定生锈
    • concat 似乎是内置编译器:github.com/rust-lang/rust/blob/master/src/libstd/macros.rs#L311 我真的不想给编译器打补丁;)
    • 您仍然可以在问题跟踪器中提出问题。在 concat! 中允许简单的常量应该不是什么大问题
    猜你喜欢
    • 2019-09-22
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2015-08-23
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多