История изменений
Исправление Lilly, (текущая версия) :
Тут есть два момента:
1)В Perl 6 области видимости лексические и местами они столь лексические, что это просто непривычно. (кроме случаев, где используется динамическая видимость, тогда нет). Дело в том, что объявление my $i
находится внутри фигурных скобок, которые являются телом test
. Не внутри какого-то другого, нового блока видимости. Поэтому они доступны в этом блоке, в котором они объявлены, скобки здесь не играют роли. Если задуматься об этом, то это в других языках происходит странность, потому что круглые скобки создают отдельное пространство видимости, которое распространяется на блок, но это вносит некое inconsistency, верно? Perl 6 это очень целостный язык, в нём «специальные случаи, когда правило нарушается» это очень редкие события.
2)loop
это довольно редкая конструкция в «реальном» Perl 6, которая нужна, когда ты прям 100% хочешь цикл в стиле С. Это бывает редко. Чаще всего ты хочешь for @source -> ...
. Если ты хочешь бесконечный цикл, то вместо while True
ты пишешь loop {...}
. Но если ты хочешь просто итерировать от 1 до 10, делай так:
sub test() { # <- внешний блок открыт здесь
loop (my $i = 0; #`( нет новых фигурных скобок, всё, что в скобках, это всё ещё внешний блок )
$i < 10; $i++)
{ #`( вокруг фигурные скобки - это внутренняя область видимости ) }
for ^10 { say "$_ " }
say "\n";
for ^10 -> $i { say "$i " }
}
test();
^10
это сокращение для 0..^10
, то есть «от 0 до 10, исключая». 0^..^10
будет от 0 до 10 исключая 0 и 10. Если начало 0, что очень частый случай, то можно сократить.
Исходная версия Lilly, :
Тут есть два момента:
1)В Perl 6 области видимости лексические и местами они столь лексические, что это просто непривычно. (кроме случаев, где используется динамическая видимость, тогда нет). Дело в том, что объявление my $i
находится внутри фигурных скобок, которые являются телом test
. Не внутри какого-то другого, нового блока видимости. Поэтому они доступны в этом блоке, в котором они объявлены, скобки здесь не играют роли. Если задуматься об этом, то это в других языках происходит странность, потому что круглые скобки создают отдельное пространство видимости, которое распространяется на блок, но это вносит некое inconsistency, верно? Perl 6 это очень целостный язык, в нём «специальные случаи, когда правило нарушается» это очень редкие события.
2)loop
это довольно редкая конструкция в «реальном» Perl 6, которая нужна, когда ты прям 100% хочешь цикл в стиле С. Это бывает редко. Чаще всего ты хочешь for @source -> ...
. Если ты хочешь бесконечный цикл, то вместо while True
ты пишешь loop {...}
. Но если ты хочешь просто итерировать от 1 до 10, делай так:
sub test() {
for ^10 { say "$_ " }
say "\n";
for ^10 -> $i { say "$i " }
}
test();
^10
это сокращение для 0..^10
, то есть «от 0 до 10, исключая». 0^..^10
будет от 0 до 10 исключая 0 и 10. Если начало 0, что очень частый случай, то можно сократить.