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

Jen*_*off 5 string-interpolation vala genie

@lf_araujo 在这个问题中提出

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

print(@ ... ) 和lines_add(@ ...) 中@ 的作用是什么?

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

概念性问题是:

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

Jen*_*off 4

Vala 和 Genie 中有两种字符串插值选项:

\n\n
    \n
  1. printf 风格的函数:

    \n\n
    var name = "Jens M\xc3\xbchlenhoff";\nvar s = string.printf ("My name is %s, 2 + 2 is %d", name, 2 + 2);\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

  2. \n
  3. 字符串模板:

    \n\n
    var name = "Jens M\xc3\xbchlenhoff";\nvar s = @"My name is $name, 2 + 2 is $(2 + 2)";\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这可以使用“编译器魔法”来实现。

    \n\n

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

    \n\n

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

    \n\n

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

  4. \n
\n\n

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

\n