2017-05-07 84 views

回答

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)); 
} 
0

根據Rust docs,這是不可能的:

(......),你可以看到,第一個參數是格式字符串。編譯器需要它 ,因爲它是一個字符串文字;它不能是 是一個傳入的變量(爲了執行有效性檢查)。

+0

雖然這不是OP的問題嗎?因爲'format'有限制,所以他們想用某種方式說'cond_format'只能用文字。 (我很肯定答案「不」是正確的答案,但它大部分是我所說的基本原理)。 – Shepmaster

+0

但在我的情況下,我不想使用'fmt_str'作爲變量;我試圖做相反的事情。 – jplrssn

+0

我把這個問題理解爲「有沒有一種方法讓函數接收一個字符串字符串,並將其作爲格式化字符串用於'格式!()'裏面的宏?」而答案是否定的 - 這是不可能的使用函數。 – ljedrz

相關問題