【问题标题】:Does Rust support Ruby-like string interpolation?Rust 是否支持类似 Ruby 的字符串插值?
【发布时间】:2014-01-24 04:47:58
【问题描述】:

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

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

puts(bbb)

> "BBB AAA"

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

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

【问题讨论】:

标签: rust string-interpolation


【解决方案1】:

Rust 具有字符串格式。

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

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

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

【讨论】:

  • 似乎讨论并没有继续下去。伤心。
  • @ChrisMorgan:这只是背景信息。背景信息在过去 23 个月内没有变化,除非您有什么想分享的。
  • 您也可以使用format!("BBB {name}", name = a)。 (实际上可能可以使用与 format 相同的解析和宏基础设施来实现 inline_fmt!("BBB {a}"),尽管可能需要一些技巧来解决问题。)
  • Python 和 C# 都添加了字符串插值。 Python:f'{a} times {b} is {a * b}.',C#:$"{a} times {b} is {a * b}"
  • 这里是关于这个主题的最新讨论:github.com/rust-lang/rfcs/issues/1250。这个答案目前感觉不再相关,因为它证明了 Rust 的字符串格式与其他语言的可移植性有关,这不再是正确的——Python、C#、JS 等,所有的语法都比 Rust 更接近 Ruby。
【解决方案2】:

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}.");

希望很快能看到。

【讨论】:

  • IMO 来自 JS,RFC 是?。提到的全插值语法{( )} 的可读性很差,尤其是与${ } 相比,而且作者对支持任意表达式的插值有一种神秘的强烈偏见。相反,他们宁愿与字符串连接给宏格式化系统带来麻烦的方式作斗争。拥有可以在${ } 中嵌入任意表达式的字符串文字语法就简单多了。
  • 它在 Rust 版本 1.58.0 中发布?
【解决方案3】:

从 Rust 1.58 开始,您可以利用 captured identifiers in format strings。这可以让你做这样的事情:

let msg = "here";
let s = format!("Abc {msg}");
println!("Hi t{msg}");
println!("{s}");

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

另请注意,Rust 2021 版 makes room 用于该语言的未来添加,例如 f"hello {name}",这将允许更简洁的字符串插值,与大多数其他现代语言相当。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多