收到:
#! /usr/bin/env raku
use v6;
multi blah (@arg) { @arg = 7; }
multi blah ($arg) { $arg = '3'; }
my @array = 1, 2, 3;
blah @array;
say @array;
my $string = 'onetwothree';
blah $string;
say $string;
Run Code Online (Sandbox Code Playgroud)
得到这个:
[7]
Cannot assign to a readonly variable or a value
in sub blah at ./chop.raku line 5
in block <unit> at ./chop.raku line 12
Run Code Online (Sandbox Code Playgroud)
我发现这种行为令人惊讶,特别是在函数范围之外更改数组的能力。
有人可以解释一下为什么我可以更改传递给函数的数组参数而不是标量吗?有没有办法使数组在传递给函数时只读?有什么方法可以使传递给函数的标量可变吗?
有人可以解释一下为什么我可以更改传递给函数的数组参数而不是标量吗?
传递给函数的参数是只读的(默认情况下;更多内容见下文),因此通常无法更改。您可以修改 的原因Array
是Array
s 本身是可变的(有关详细信息,请参阅文档中的列表、序列和数组页面)。这意味着,即使您无法更改Array
本身,您仍然可以更改中的值Array
。
有没有办法使数组在传递给函数时只读?
List是 Raku 的位置数据不可变类型(某种程度上;它不是深度不可变的,但这超出了这里的范围)。如果将 a 传递List
给函数,该函数将无法修改该列表的内容。例如,此代码会引发错误:
my @l is List = (1, 2, 3);
sub f(@var) { @var[1] = 42 }
f @l;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使传递给函数的标量可变吗?
有两种方法,具体取决于您想要哪种类型的可变性:您可以使用is rw
和is copy
特征。例如,您可以声明如下函数:
sub f($a is copy, $b is rw) {...}
Run Code Online (Sandbox Code Playgroud)
该声明允许&f
修改$a
和$b
。但是 for$a
正在&f
修改其自己的本地副本,并且不会对其调用者看到的值产生任何影响$a
。$b
然而,With&f
正在修改共享状态,并且它所做的任何更改$b
即使在 的范围之外也是可见的&f
。
归档时间: |
|
查看次数: |
314 次 |
最近记录: |