如果我有一个变量 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/