該片段拒絕編譯,因爲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)
}
}
該片段拒絕編譯,因爲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)
}
}
編號在類型,名稱或值甚至存在之前擴展宏。這是沒有可能的方式來工作。因此,語言在運行時沒有理由區分文字和非文字:即使是,也無法使用該信息。
你有使用宏。以下是這樣做的兩種可能的方式。
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));
}
根據Rust docs,這是不可能的:
(......),你可以看到,第一個參數是格式字符串。編譯器需要它 ,因爲它是一個字符串文字;它不能是 是一個傳入的變量(爲了執行有效性檢查)。
雖然這不是OP的問題嗎?因爲'format'有限制,所以他們想用某種方式說'cond_format'只能用文字。 (我很肯定答案「不」是正確的答案,但它大部分是我所說的基本原理)。 – Shepmaster
但在我的情況下,我不想使用'fmt_str'作爲變量;我試圖做相反的事情。 – jplrssn
我把這個問題理解爲「有沒有一種方法讓函數接收一個字符串字符串,並將其作爲格式化字符串用於'格式!()'裏面的宏?」而答案是否定的 - 這是不可能的使用函數。 – ljedrz
爲此使用一個宏。 – kennytm