我很难理解何时以及为什么在推送Scalar后会影响推送的容器所持有的价值。我将在两个风格化的示例中尝试说明我在更复杂的上下文中遇到的问题。
*示例1 *在第一个示例中,标量作为a的一部分$i被推到数组@b上List。推送之后,使用$i++指令在for循环的后续迭代中显式更新标量持有的值。这些更新会影响数组中的值@b:在for循环的末尾,@b[0;0]等于3,不再等于2。
my @b;
my $i=0;
for 1..3 -> $x {
$i++;
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $x == 2 {
@b.push(($i,1));
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @b;
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
Run Code Online (Sandbox Code Playgroud)
输出示例1:
Loose var $i: Scalar|94884317665520 …Run Code Online (Sandbox Code Playgroud) 该Perl6文档状态“默认情况下,参数绑定到他们的说法,并标记为只读。” 但是运行以下代码:
# Example 1
sub f1 ( $x ) { say $x.VAR.WHAT; say $x.WHAT; say $x }
f1(1);
Run Code Online (Sandbox Code Playgroud)
产量:
(Scalar)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
而这段代码:
# Example 2
my $y := 1;
say $y.VAR.WHAT; say $y.WHAT; say $y;
Run Code Online (Sandbox Code Playgroud)
产量:
(Int)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
这(Scalar)是我不理解的Example1的输出:我应该将Int 1参数绑定到标识符时,为什么会有标量$x?似乎该值已1“分配”给$x,而不是“绑定”了。
我正在尝试找出上述例程之间的区别以及if语句是否像
say $y.Bool;
say $y.so;
say ? $y;
say so $y;
Run Code Online (Sandbox Code Playgroud)
会产生不同的结果。
到目前为止,对我而言,唯一明显的区别是?优先级高于so。.Bool而.so似乎是完全同义。这是正确的,(实际上)是完整的故事吗?
如果我有一个Str类型的对象,并且我想将它强制转换为Int,那么我的理解是我可以通过在Str-object上调用Int方法来实现这一点,如下所示:
"100".Int
我(我想)知道我可以这样做,因为https://docs.perl6.org/type/Str上的Str类型文档列出了Int-method.现在,为了将这个新创建的Int强制转换为Complex类型的对象,我尝试了以下强制:
"100".Int.Complex
哪个有效:-)所以没问题.除了我无法弄清楚它为何起作用.https://docs.perl6.org/type/Int上的Int类型文档未列出方法Complex.我确实为ComplexStr类找到了一个具有此名称的方法,但我不知道这是否与我的Int有关,或者没有.
所以问题是:上述强制如何运作?复合方法来自何处?我怎么能知道我可以在尝试之前在Int-object上调用它?
让我说,我明白,我要问关于标题是可疑的做法(如解释开始在这里),但我缺乏了解涉及所涉及的语法.
当我第一次尝试将标量绑定到无标记符号时,我这样做了:
my \a = $(3);
Run Code Online (Sandbox Code Playgroud)
认为$(...)将Int 3打包在标量中(如文档中似乎所建议的那样),然后将其绑定到符号a.这似乎不起作用:Scalar无处可寻(a.VAR.WHATreturn(Int),而不是(Scalar)).
在上面提到的帖子中,raiph提到可以使用不同的语法执行所需的绑定:
my \a = $ = 3;
Run Code Online (Sandbox Code Playgroud)
哪个有效.鉴于结果,我怀疑该陈述可以等同地表达,虽然不那么简洁,因为:my \a = (my $ = 3)我可以理解.
这留下了一个问题:为什么尝试$(...)不起作用,它又做了什么?
当我在Perl6 REPL中执行以下语句时:
my $var = 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)
它打印:
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
这似乎好奇的我,因为$var实际上被分配一个整数(即$var.WHAT回报(Int)),而不是一个List的Int秒.
我认为Int分配a 的原因是项目赋值operator(=)相对于逗号运算符(,)的优先级更高,它留下了,2,3in sink上下文.但是,为什么在REPL显示List的IntS' 在执行语句后,REPL通常会显示什么?
我很难搞清楚为什么声明
say "\c500";
Run Code Online (Sandbox Code Playgroud)
按预期在屏幕上生成字符'Ǵ',而以下语句在编译时给出错误消息("无法识别的\ c字符"):
my $i = 500;
say "\c$i";
Run Code Online (Sandbox Code Playgroud)
即使
say "$i"; # or 'say $i.Str;' for that matter
Run Code Online (Sandbox Code Playgroud)
产生"500"(带"$ i".WHAT表示类型为Str).