LoginSignup
5
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-18

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

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 になる。
これが一番素直な挙動な気がしなくもない。

5
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2