当我在Raku中运行这个脚本时,我会得到带有几行换行符的字母A。为什么我要而不是像预期的那样得到连接的字符串(和Perl5一样)?
编辑 BTW可以用Perl5编译器在commaIDE中编译文件,在哪里可以将该编译器更改为Perl5编译器?
say "A";
my $string1 = "00aabb";
my $string2 = "02babe";
say join ("A", $string1, $string2);
print "\n";
my @strings = ($string1, $string2);
say join ("A", @strings);
print "\n";发布于 2021-05-31 20:46:30
我建议的解决办法是放弃父母:
say "A";
my $string1 = "00aabb";
my $string2 = "02babe";
say join "A", $string1, $string2; # Pass THREE arguments to `join`, not ONE
print "\n";
my @strings = $string1, $string2;
say join "A", @strings;
print "\n";(第二次调用join时,join中的元素是扁平的,因此其作用与对join的第一次调用相同。)
上面的代码显示:
A
00aabbA02babe
00aabbA02babe当我在
Raku中运行这个脚本时,我会得到带有几行换行符的字母A。
您的代码使用一个参数(即合并器)调用join,并将零字符串连接起来。因此,join调用生成空字符串。因此你会得到空白行。
为什么我没有得到连接的字符串?
代码中的两个say join...语句只打印一个换行符,因为它们类似于下面的第三行和第四行say:
say join( " \o/ ", "one?", "two?" ); # one? \o/ two?
say join " \o/ ", "one?", "two?" ; # one? \o/ two?
say join ( " \o/ ", "one?", "two?" ); # 
say join( " \o/ one? two?" ); # 上面的第一行和第二行将三个字符串传递给join。第三个传递一个List,然后强迫它成为一个字符串(用单个空格字符连接的List元素的级联),即与第四行相同的结果。
my @strings = ($string1, $string2);咒语恰巧按照您的意愿工作,因为分配给=左侧的“复数”变量将迭代右边的值或值列表。
但是,在Raku中,错误地避免冗余代码是一个好习惯,在这种情况下,只有当您必须使用parens来表达与没有它们的代码不同的东西时,才使用parens。这是Raku中的一个通用原理,它可以使代码高信号、低噪音。对于您的代码,所有的父母都是多余的。
发布于 2021-05-31 20:42:06
问题是函数名称后面的空格。如果你在那里留下一个空格,raku会把偏执中的表达式当作一个列表来处理,这是一个单一的东西。在这里,join会认为您想要使用列表作为合并器。
观察:
>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo( 'abc', )"
(Str)
>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo ( 'abc', )"
(List) 所以简单地说,如果你想用偏执来称呼一个子,不要在子名和开头的帕伦之间加一个空格。
发布于 2021-05-31 20:42:53
请参阅要避免的陷阱,试着:
my @s=("00aabb", "02babe");
say join "A", @s;
say join |("A",@s);
say join("A",@s);
say @s.join: "A";
#or some crazy
say join\ ("A",@s);
say "A".&join: @s;
say join @s: "A";
say "A" [&join] @s;
say @s R[&join] "A";
#…https://stackoverflow.com/questions/67778486
复制相似问题