在 Ruby 中我可以这样做。
aaa = "AAA"
bbb = "BBB #{aaa}"
puts(bbb)
> "BBB AAA"
这种语法的目的是消除重复,并使其感觉像一个shell脚本-非常适合于大量字符串操作。
Rust支持此功能吗?或者有计划支持此功能吗?或者有一些可以模仿此功能的特性吗?
在 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 是原始提案。
{( )}
阅读起来很糟糕,特别是与${ }
相比,而且作者神秘地对支持任意表达式的内插有很强的偏见。相反,他们宁愿处理字符串连接方式对宏格式系统造成的影响。使用一个字符串文字语法,在${ }
中嵌入任意表达式就简单多了。 - Andy'lbl : {
这样的语法结构却非常接近(这是一个标签冒号,还是一个格式化冒号?)。现在仍然有很多可能性,但是当涉及到承诺新功能和语法时,Rust开发者非常谨慎。他们可能从JavaScript的例子中吸取了教训,后者不加思索地添加每一个新潮流,并陷入了遗留代码的困境。 - 4xelRust有字符串格式化功能。
fn main() {
let a = "AAA";
let b = format!("BBB {}", a);
println(b);
}
// output: BBB AAA
在Rust版本中,没有额外的重复,但必须显式调用format!()
,并且插入的值与字符串分开。这基本上与Python和C#开发人员习惯的做法相同,其原理是这种技术使得将代码本地化到其他语言变得更容易。format!("BBB {name}", name = a)
。 (实际上,可能可以使用与format
相同的解析和宏基础设施来实现inline_fmt!("BBB {a}")
,但是卫生可能需要一些技巧来解决。) - huonf'{a} times {b} is {a * b}.'
,而C#的写法是:$"{a} times {b} is {a * b}"
。 - Ghost4Man从 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}"
,这将允许更简洁的字符串插值,与大多数现代语言相当。