Rust 支持类似 Ruby 的字符串插值吗?

问题描述 投票:0回答:4

在 Ruby 中我可以做到这一点。

aaa = "AAA"
bbb = "BBB #{aaa}"

puts(bbb)

> "BBB AAA"

此语法的要点是消除重复,并使其感觉像 shell 脚本 - 非常适合繁重的字符串操作。

Rust 支持这个吗?或者有计划支持这个吗?或者有一些功能可以模仿这个?

rust string-interpolation
4个回答
92
投票

自 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 是原始提案。


81
投票

Rust 有字符串格式。

fn main() {
    let a = "AAA";
    let b = format!("BBB {}", a);
    println(b);
}
// output: BBB AAA

在 Rust 版本中,没有额外的重复,但您必须显式调用

format!()
并且插入的值与字符串分开。这基本上与 Python 和 C# 开发人员习惯做事的方式相同,其基本原理是这种技术可以更轻松地将代码本地化为其他语言。

Rust 邮件列表有一个存档讨论([rust-dev] 建议),其中讨论了不同类型的字符串插值。


47
投票

从 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}"
,与大多数其他现代语言相比,这将允许更简洁的字符串插值。


0
投票

不,不是。虽然 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"
© www.soinside.com 2019 - 2024. All rights reserved.