string - 在 Raku 中不创建字符串上下文的情况下进行插值?

标签 string raku string-interpolation rakudo

如果我有一个变量 my $a = True ,然后我从以下代码中得到这个输出:

say «a list of words foo $a bar baz».raku; 
# OUTPUT: ("a", "list", "of", "words", "foo", "True", "bar", "baz")
也就是说,即使结果是 List , 元素 True在被包含在列表中之前被字符串化——列表包含 "True" ,不是 True .有什么方法可以在仍然使用插值的同时避免这种字符串化?
如果 $a 有没有办法这样做是我定义的类(因此可以为其编写 Str 方法)而不是 Bool ?
(我知道我可以写更详细的 ("a", "list", "of", "words", "foo", $a, "bar", "baz")«a list of words foo».Slip, $a, «bar baz».Slip ,但我问是否有办法仍然使用插值)。

最佳答案

插值是将一个东西放入一个字符串中。

"a b c $thing d e f"
它首先将事物本身变成一个字符串,然后将字符串的其余部分串联起来。
基本上上面编译成这个代码:
infix:<~>( 「a b c 」, $thing.Str, 「 d e f」 )
« a b c $thing »
简称:
Q :double :quotewords « a b c $thing d e f »
即使用 Q uoting DSL,开启 :double引用语义( “” )并打开 :quotewords .:quotewords是将字符串拆分为各个部分的功能。
它只有在变成字符串后才会发生。
想象一下,上面编译成:
Internals::quotewords( infix:<~>( 「 a b c 」, $thing.Str, 「 d e f 」 ) )

除了使用 .Slip 之外,还有另一种方法可以获得您想要的东西。或前缀 | .
flat «a list of words foo», $a, «bar baz»

引用 DSL 的全部目的是生成一个字符串。
那就是 :words , :quotewords , 和 :val所有更改它以便它返回单个字符串以外的其他内容。
他们的想法是改变 DSL。
所以可能 你可以说服足够多的人相信这样的改变是值得的。
那是一个很大的可能。
它可能会破坏许多现有的代码库,因此您将面临一场艰苦的战斗。

关于string - 在 Raku 中不创建字符串上下文的情况下进行插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66642634/

相关文章:

c - fgets 应该使用什么大小?

visual-studio - dotnet framework 4 中的字符串比较

raku - 什么是 nqp、nqp-m、rakudo-debug、rakudo-debug-m、rakudo-gdb-m、rakudo-m、rakudo-valgrind-m?

multidimensional-array - perl6 : access values in a multidimensional variable

string - 在Flex/Bison中实现字符串插值

检查字符串是否是回文

string - Rust 编程竞赛中最快的惯用 I/O 例程?

jvm - Parrot 与其他虚拟机相比如何?

python - 如何推迟/推迟 f 弦的评估?

javascript - formik 中的嵌套字段数组