gpt4 book ai didi

perl - 我可以请一个 ArrayOutOfBoundsException 吗?

转载 作者:行者123 更新时间:2023-12-04 16:19:04 27 4
gpt4 key购买 nike

在 Python 中,如果您使用越界键/索引对集合结构进行索引,您会得到一记耳光:

>>> [1, 2, 3][9]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

这是一个异常(exception);它派生自 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 中基本上是一样的,除了你没有得到返回的值,但执行继续正常。

我不明白为什么越界访问应该是 无声 .您获得该值的唯一警告可能是“未初始化”(但我们都知道这实际上意味着 不存在 )是当您将其赋予某些功能时。

我能以某种方式解决这个问题吗?我可以实现我自己的 post-circumfix 索引操作符来覆盖在垃圾索引上消失的默认操作符,但是没有办法区分未初始化的值和类型 Any 之间的区别。 .我能看到的唯一方法是检查请求的索引是否在 List.elems() 范围内。 .

我可以使用什么(最好是最小的、简单的、干净的、可读的等)解决方案来解决这个问题?

在有人说“是的,但变量未初始化,例如 my $x; !”之前:在 C 中,如果您访问未分配的内存,则会出现段错误;为什么我不能有那种安全感?

我将其标记为 Perl 和 Perl 6,因为虽然我正在学习 Perl 6 并且这个问题的细节主要适用于 6,但主要思想似乎是 5 和 6 的共同方面。

最佳答案

Perl 6 具有整形数组以在简单或多维数组上强制执行数组边界。

来自 S09 :

my int @ints[4;2];          # Valid indices are 0..3 ; 0..1
my @calendar[12;31;24]; # Valid indices are 0..11 ; 0..30 ; 0..23

还有一些例子:
use v6;
# declare an array with four elements
my @l[4] = (1..4);
try { @l.push: 42}
say @l;
# [1 2 3 4]

这些可以是多维的
my @tic_tac_toe[3;3] = <x o x>, <o . o>, < x o x>;
@tic_tac_toe[1;1] = "x"; # ok
try @tic_tac_toe[3][3] = "o"; # illegal
say @tic_tac_toe;
# [[x o x] [o x o] [x o x]]

关于perl - 我可以请一个 ArrayOutOfBoundsException 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35028504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com