在 Ruby 中我可以做到这一点。
aaa = "AAA"
bbb = "BBB #{aaa}"
puts(bbb)
> "BBB AAA"
此语法的要点是消除重复,并使其感觉像 shell 脚本 - 非常适合繁重的字符串操作。
Rust 支持这个吗?或者有计划支持这个吗?或者有一些功能可以模仿这个?
自 Rust 1.58 起可用!语法如下:
let (person, species, name) = ("Charlie Brown", "dog", "Snoopy");
// implicit named argument `person`
print!("Hello {person}");
// implicit named arguments `species` and `name`
format!("The {species}'s name is {name}.");
RFC 2795 是原始提案。
Rust 有字符串格式。
fn main() {
let a = "AAA";
let b = format!("BBB {}", a);
println(b);
}
// output: BBB AAA
在 Rust 版本中,没有额外的重复,但您必须显式调用
format!()
并且插入的值与字符串分开。这基本上与 Python 和 C# 开发人员习惯做事的方式相同,其基本原理是这种技术可以更轻松地将代码本地化为其他语言。
Rust 邮件列表有一个存档讨论([rust-dev] 建议),其中讨论了不同类型的字符串插值。
从 Rust 1.58 开始,您可以利用格式字符串中捕获的标识符。这可以让你做这样的事情:
let msg = "here";
let s = format!("Abc {msg}");
println!("Hi t{msg}"); // prints "Hi there"
println!("{s}"); // prints "Abc here"
这个功能可以看作是字符串插值的一个子集。不支持像
format!("Abc {a+b}")
这样的表达式,目前还不清楚是否会添加这样的功能。还有关于为点路径添加表达式子集的讨论,如format!("Abc {foo.bar}")
。
另请注意,Rust 2021 版为该语言的未来添加留出了空间,例如
f"hello {name}"
,与大多数其他现代语言相比,这将允许更简洁的字符串插值。
不,不是。虽然 Rust 1.58 添加了“在格式字符串中捕获标识符”,但它不是字符串插值。相反,它允许您使用当前作用域作为
println!
宏的关键字参数——因此这是传递这些命名参数的快捷方式:
let name = "eonil";
// These two are equivalent:
println!("Hi {name}!");
println!("Hi {name}!", name = name);
这个答案深入解释了它。
由于它只是用于格式化宏的语法糖,因此它不像一般字符串插值那样工作:
let revision = 34343;
let output = Command::new("TortoiseProc.exe")
.arg("/command:log")
.arg("/startrev:{revision}")
// launches uninterpolated "TortoiseProc.exe /command:log /startrev:{revision}"
let output = Command::new("TortoiseProc.exe")
.arg("/command:log")
.arg(format!("/startrev:{revision}")) // using the macro
// launches intended "TortoiseProc.exe /command:log /startrev:34343"