字符串插值/字符串模板如何工作?

How does string interpolation / string templates work?

:

var dic = new dict of string, string
dic["z"] = "23"
dic["abc"] = "42"
dic["pi"] = "3.141"
for k in sorted_string_collection (dic.keys)
    print (@"$k: $(dic[k])")

What is the function of @ in print(@ ... ) and lines_add(@ ...)?

由于这对 Genie 和 Vala 都适用,我认为它更适合作为一个独立的问题。

概念题是:

Vala 和 Genie 中的字符串插值是如何工作的?

Vala和Genie中string interpolation有两个选项:

  1. printf-style 函数:

    var name = "Jens Mühlenhoff";
    var s = string.printf ("My name is %s, 2 + 2 is %d", name, 2 + 2);
    

    这可以使用可变参数,您必须将具有正确类型的多个参数传递给可变参数函数(在本例中 string.printf)。

  2. 字符串模板:

    var name = "Jens Mühlenhoff";
    var s = @"My name is $name, 2 + 2 is $(2 + 2)";
    

    这可以使用 "compiler magic"。

    模板字符串以 @" 开头(而不是以 " 开头的普通字符串)。

    模板字符串中的表达式以 $ 开头并用 () 括起来。当表达式不包含白色 space 时,括号是不必要的,如上例中的 $name

    在将表达式放入字符串模板生成的字符串之前,先对表达式求值。对于非 string 类型的表达式,编译器会尝试调用 .to_string (),因此您不必显式调用它。在 $(2 + 2) 示例中,表达式 2 + 2 被评估为 4,然后调用 4.to_string () 将导致 "4",然后可以将其放入字符串模板中.

PS:我在这里使用 Vala 语法,只需删除 ;s 即可转换为 Genie。