问题1:条件表达式
由于配置标志可以解释为整数,因此它们可以用作变体数组中的索引。
// Configuration flag
static CONFIG_FLAG: uint = 1;
// Variants of any static type
type T = &'static str;
static VARIANT1: T = "True";
static VARIANT2: T = "False";
// Now you can select, but you have to invert either flag, or variants, or your brain
static SELECTED: T = [VARIANT1, VARIANT2][1 - CONFIG_FLAG];
fn main() {
println!("{}", SELECTED);
}
Notes:
CONFIG_FLAG
由于问题, bool 类型当前不适用于数组索引#5873,
// error: can't cast str to uint
static SELECTED: T = [VARIANT1, VARIANT2][1 - CONFIG_FLAG_BOOL as uint];
因此,您必须再创建一个静态项,然后在条件中使用它。
static CONFIG_FLAG_UINT: uint = CONFIG_FLAG_BOOL as uint;
问题2:编译时字符串连接
简单的 C 宏可以很好地映射到 Rust 宏,因此您可以使用与 C 中相同的方法进行字符串连接。
唯一的区别是您必须显式使用 concat!而不是仅仅将文字彼此相邻放置。
#![feature(macro_rules)]
// Define new macro-string with name $name assembled from arguments $arg
macro_rules! define_str (
($name: ident, $($arg: expr), +)
=>
(macro_rules! $name (
() => (concat!($($arg), +))
));
)
// Some strings
define_str!(ROOT_DIR, "/root")
define_str!(SUB_DIR, ROOT_DIR!(), "/sub")
define_str!(FILE_NAME, SUB_DIR!(), "/file")
define_str!(NONSENSE, FILE_NAME!(), SUB_DIR!(), ROOT_DIR!())
fn main() {
println!("{}", FILE_NAME!());
println!("{}", NONSENSE!());
}
Notes:
我想添加!()
自动为宏名称内部define_str
加上像这样的附加宏,
macro_rules! add_bang_and_parens (
($arg: ident) => ($arg!());
($arg: expr) => ($arg);
)
但在宏中,基于参数“类型”的模式匹配目前似乎是不可能的。