是否可以指定函数参数必须是字符串文字?

时间:2017-05-07 14:46:19

标签: rust

此片段拒绝编译,因为format!()不会触及非文字字符串。

fn cond_format<T: std::fmt::Display>(cond: bool, fmt_str: &'static str, item: T) -> String {
    if cond {
        format!(fmt_str, item)
    } else {
        format!("{}", item)
    }
}

2 个答案:

答案 0 :(得分:3)

没有。在类型,名称或值甚至存在之前扩展宏。没有可能的方法来工作。因此,语言没有理由在运行时区分文字和非文字:即使,也没有什么能够使用该信息。

使用宏。以下是两种可行的方法。

macro_rules! cond_format {
    ($fmt_str:expr) => {
        |cond: bool, item| -> String {
            if cond {
                format!($fmt_str, item)
            } else {
                format!("{}", item)
            }
        }
    };

    ($cond:expr, $fmt_str:expr, $item:expr) => {
        if $cond {
            format!($fmt_str, $item)
        } else {
            format!("{}", $item)
        }
    };
}

fn main() {
    println!("{}", cond_format!("{:x}")(false, 42));
    println!("{}", cond_format!(true, "{:x}", 42));
}

答案 1 :(得分:0)

根据Rust docs,这是不可能的:

  

(...)你可以看到第一个参数是一个格式字符串。它   编译器要求它为字符串文字;这不可以   是传入的变量(为了执行有效性检查)。