В Perl6 нет операторов ,=
или ~=
.
Это экземпляры мета-оператора =
в сочетании с другим инфиксным оператором.
# these are all functionally equivalent:
$a = $a ~ 'a';
$a ~= 'a';
$a [~]= 'a';
$a [&[~]]= 'a';
$a [&infix:<~>]= 'a';
$a = infix:<~> $a, 'a'; # use an operator as a subroutine
Существует история языков, подобных С, с такими операторами, как +=
.
Было бы немного утомительно определять новые операторы, подобные этим, для каждого инфиксного оператора.
В Perl6 вы также можете легко определять новые операторы.
Таким образом, он имеет =
в качестве мета-оператора, который будет автоматически работать со всеми инфиксными операторами.
sub infix:<foo> (\l,\r){…}
$a = $a foo 3;
$a foo= 3;
$a [foo]= 3;
Если вы хотите использовать такой оператор, как +=
, просто посмотритедля базового оператора, который соответствует тому, что вы хотите, и добавьте =
.
Если вы хотите выполнить конкатенацию строк, базовый оператор - это оператор infix ~
.
(который очень похож наПрефиксный оператор приведения строки ~
.)
$a = $a ~ 'a';
$a ~= 'a';
Если вы хотите установить Разницу, базовый оператор будет (-)
.
$a = $a (-) 3;
$a (-)= 3;
. Вы можете добавить любойчисло []
, окружающее инфиксный оператор.
(Ему нужно пространство перед ним, чтобы его не перепутать с postcircumfix []
)
$a - 3;
$a [-] 3;
$a [[-]] 3;
$a [[[-]]] 3;
Что может быть полезно, чтобы убедиться, что мета-операторы комбинируют то, что вам нужно.
$a -= 3;
$a [-]= 3;
3 R-= $a; # $a = $a - 3;
$a [R-]= 3; # $a = 3 - $a;
3 R[-=] $a; # $a = $a - 3;
3 R[[R-]=] $a; # $a = 3 - $a;
Это было расширено так, что [&…]
, где &…
- имя функции, работает как инфиксный оператор.
sub bar (\l,\r){…}
# these are functionally identical.
$a = bar( $a, 3 );
$a = $a [&bar] 3;
$a [&bar]= 3;
Когда вы использовали ,=
, высоздал самоссылочную структуру данных.
(обратите внимание, что say
вызывает .gist
, я добавил дополнительный .gist
, чтобы было ясно, что я не печатаю Str
.)
my $c = 0;
# $c ,= 1;
$c = ($c,1);
say $c.gist;
# (\List_94195670785568 = (List_94195670785568 1))
say $c.WHICH;
# List|94195670785568
Когда вы делаете что-то, что приводит List
или Array
в Str
, оно следует структуре, превращающей каждую часть в Str
.
$c = ($c,…);
~$c;
# $c.Str
# | \___________________
# | \
# $c[0].Str ~ ' ' ~ $c[1].Str
# | \ \ \__________
# | | \ \__________________ 1.Str
# | | \
# | V \_____________
# | \
# $c[0].Str ~ ' ' ~ $c[1].Str
# | \ \ \__________
# | | \ \__________________ 1.Str
# | | \
# | V \_____________
# | \
# $c[0].Str ~ ' ' ~ $c[1].Str
# | \ \ \__________
# | | \ \__________________ 1.Str
# | | \
# | V \_____________
# | \
# …
Это, конечно, никогдазаканчивает превращать первую часть в Str.
Комбинация ,
и =
безопасно работает с хэшем.
(Это то, что показывают документы.)
my %c = a => 0;
%c ,= b => 1;
# %c = (%c, b => 1)
say %c.gist;
# {a => 0, b => 1}