В Python, если индекс коллекции структура с ключом/индексом недоступных, вы получите пощечину:Могу ли я получить ArrayOutOfBoundsException?
>>> [1, 2, 3][9]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Это исключение; это происходит из BaseException, и неспособность справиться с этим будет сбой моей программы, что почти всегда то, что я хочу.
Perl 5 и 6 в списке индексации, кажется, не заботится о недоступный индексации:
$ perl6
> my @l = (1..4);
[1 2 3 4]
> say @l[2];
3
> say @l[9];
(Any)
> print @l[9];
Use of uninitialized value @l of type Any in string context
<snip>
True
> my $x = @l[9]; # even assignment doesn't error! who decided this was okay!?
> say $x; print $x;
(Any)
Use of uninitialized value $x of type Any in string context
<snip>
это в основном то же самое в Perl 5, за исключением того, вы не получите значение но выполнение продолжается как обычно.
Я не понимаю, почему доступ за пределы доступа должен когда-либо быть silent. Единственные предупреждения, которые вы получаете, могут быть «неинициализированы» (но мы все знаем, что это действительно означает, что не существует), когда вы передаете его определенным функциям.
Могу ли я это исправить? Я мог бы реализовать свой собственный оператор индексирования после обхода, чтобы переопределить значение по умолчанию, которое умирает на индекс нежелательной почты, но нет возможности рассказать разницу между неинициализированным значением и типом Any
. Единственный способ сделать это: I может видеть, чтобы проверить, находится ли запрошенный индекс в диапазоне List.elems()
.
Какое (желательно минимальное, простое, чистое, читаемое и т. Д.) Решение можно использовать, чтобы исправить это?
Перед кем говорит «да, но переменная неиницализированные, как my $x;
!»: В C вы получаете Segfault, если доступ к памяти, вы не выделять; почему я не могу иметь такую безопасность?
Я помечено это и как Perl и Perl 6, потому что, в то время как я учусь Perl 6 и подробные сведения этого вопроса применяются в основном до 6, основная идея, как представляется, общий аспект как 5 и 6.
Ошибка сегментации в C лучше, чем выполнение продолжается, как будто ничего не произошло. – cat
Perl делает то, что вы просите у него, несмотря ни на что. Предполагается, что вы знаете, о чем вы просите, ну это на самом деле не предполагает ничего. Это действительно не могло дать летающий прыжок, если вы знаете или хотите, что вы просите его, это просто даст вам это. Если вы проверите «если определено», вам не нужно использовать исключения, такие как костыли. В основном это сдвиг парадигмы и являющийся разработчиком python. В этой статье довольно четко изложены различия мнений: http://yosefk.com/blog/what-makes-cover-up-preferable-to-error-handling.html – scrappedcola
@scrappedcola Спасибо за ответ! Я знаю, вы можете сказать, что я полна питонизмов, но я не могу думать о каком-либо другом языке, где это не вызовет крушения, просто потому, что нет никакой другой логической реакции. – cat