字符串插值/字符串模板如何工作?
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有两个选项:
printf-style 函数:
var name = "Jens Mühlenhoff";
var s = string.printf ("My name is %s, 2 + 2 is %d", name, 2 + 2);
这可以使用可变参数,您必须将具有正确类型的多个参数传递给可变参数函数(在本例中 string.printf
)。
字符串模板:
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。
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有两个选项:
printf-style 函数:
var name = "Jens Mühlenhoff"; var s = string.printf ("My name is %s, 2 + 2 is %d", name, 2 + 2);
这可以使用可变参数,您必须将具有正确类型的多个参数传递给可变参数函数(在本例中
string.printf
)。字符串模板:
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。