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

Eon*_*nil 22 string-interpolation rust

在Ruby中,我可以做到这一点.

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

puts(bbb)

> "BBB AAA"
Run Code Online (Sandbox Code Playgroud)

这种语法的重点是消除重复,并使其感觉像一个shell脚本 - 非常适合繁重的字符串操作.

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

at5*_*321 47

从 Rust 1.58 开始,您可以利用格式字符串中捕获的标识符。这可以让你做这样的事情:

let msg = "here";
let s = format!("Abc {msg}");  
println!("Hi t{msg}");   // prints "Hi there"
println!("{s}");         // prints "Abc here" 
Run Code Online (Sandbox Code Playgroud)

该功能可以看作是字符串插值的子集。不支持类似的表达式format!("Abc {a+b}"),并且尚不清楚是否会添加这样的功能。还有关于为点路径添加表达式子集的讨论,如 中所示format!("Abc {foo.bar}")

另请注意,Rust 2021 版本为该语言的未来添加内容留出了空间,例如f"hello {name}",与大多数其他现代语言相比,这将允许更简洁的字符串插值。


Die*_*Epp 36

Rust有字符串格式.

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

在Rust版本中,没有额外的重复,但您必须显式调用format!(),并且插入的值与字符串分开.这与Python和C#开发人员习惯使用的方式基本相同,理由是这种技术可以更轻松地将代码本地化为其他语言.

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

  • 似乎讨论没有继续下去.伤心. (8认同)
  • Python 和 C# 都添加了字符串插值。Python:`f'{a} 乘以 {b} 等于 {a * b}。'`,C#:`$"{a} 乘以 {b} 等于 {a * b}"` (8认同)
  • 你也可以使用`format!("BBB {name}",name = a)`.(实际上可能使用与`format`相同的解析和宏基础设施来实现`inline_fmt!("BBB {a}")`,尽管卫生可能需要一些技巧来解决.) (6认同)
  • 以下是有关此主题的最新讨论:https://github.com/rust-lang/rfcs/issues/1250。这个答案目前感觉不再相关了,因为它证明了 Rust 的字符串格式是为了向其他语言移植,但现在已经不再正确了——Python、C#、JS 等,它们的语法都比 Rust 更接近 Ruby。 (3认同)

Eon*_*nil 31

RFC 2795已被接受,但尚未实施。建议的语法:

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}.");
Run Code Online (Sandbox Code Playgroud)

我希望很快就能看到它。

  • 它在 Rust 版本 1.58.0 中发布 (23认同)
  • IMO 来自 JS,RFC 是 . 提到的全插值语法“{( )}”的可读性很差,特别是与“${ }”相比,而且作者对支持任意表达式的插值有一种神秘的强烈偏见。相反,他们宁愿努力解决字符串连接对宏格式化系统造成影响的方式。使用可以在“${ }”中嵌入任意表达式的字符串文字语法要简单得多。 (6认同)
  • 我不明白为什么不可能对嵌入在字符串模板文字中的任意表达式进行类型检查。似乎主要问题是他们想坚持使用宏在普通的旧字符串模板上进行格式化,而不是向语言语法添加新的字符串模板文字语法。 (3认同)