リストのインデックスを飛ばした場合の各 LL 言語の挙動の違い

  • 3
    いいね
  • 4
    コメント

「だから何」という話ではあるんだけども、各言語で挙動が違っておもしろいなぁ、と思ったので。

JavaScript

var arr = [];
arr[100] = 'foo';
console.log(arr.length); //=> 101
console.log(arr[0]); //=> undefined
console.log(arr[101]); //=> undefined

未定義のインデックスは undefined を返す。

"use strict"; を宣言しても実行結果は変わらない。

Perl

my @arr;
$arr[100] = 'foo';
print $#arr; #=> 100
print defined $arr[0] ? 1 : 0; #=> 0
print defined $arr[101] ? 1 : 0; #=> 0

JavaScript と同じく、未定義のインデックスは undef になるっぽい。

use strict; を宣言しても実行結果は変わらない。

Ruby

arr = []
arr[100] = 'foo'
p arr.size #=> 101
p arr[0] #=> nil
p arr[101] #=> nil

JavaScript / Perl とだいたい同じだが nil になる。
undefined 相当のものが無いからだと思われる。

PHP

$arr = array();
$arr[100] = 'foo';
echo count($arr); //=> 1
echo is_null($arr[0]); //=> 1
echo is_null($arr[101]); //=> 1

未定義のインデックスは null になる。

配列の長さは 1 になるのが他の言語とは違う。
PHP はリストもハッシュ(ディクショナリ)も array なのでこうなるのだと思われる。

[追記]

未定義のインデックスへのアクセスは E_NOTICE レベルのエラーが発生するとのこと。(詳細はコメント欄を参照)

error_reporting(E_ALL); // E_NOTICE を出力するように設定

$arr = array();
$arr[100] = 'foo';
echo $arr[0]; //=> Notice: Undefined offset: 0

Python

arr = []
arr[100] = 'foo' #=> IndexError: list assignment index out of range

存在しないインデックスに対して参照/代入しようとすると IndexError になる。
これが一番素直な挙動な気がしなくもない。