此片段拒绝编译,因为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)
}
}
答案 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,这是不可能的:
(...)你可以看到第一个参数是一个格式字符串。它 编译器要求它为字符串文字;这不可以 是传入的变量(为了执行有效性检查)。