Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2010-11-10

とあるスクリプト言語に配列が欲しい

昨日の話はclassを導入しなくてもプロトタイプベースでオブジェクト指向をやるという方向性もあるのかもしれないと思った。

プロトタイプベースというのをよく知らなかったんだけど。 あれこれ頭ん中で考えているとそういうのが自然と分かってくるね。

考えるだけでずいぶんと勉強に。 普ものだなあ段何気なく使ってたものについてほんと考えさせられる。

さて今日は配列に期待することを書き出してみるぞ!

リテラル

Rubyっぽい書き方に慣れているのでRubyっぽく書いてみる。

a = [1, 2, 3]
a[0] // => 1

もちろん最後の「,」は省略可能だが書いてもいい。

空の配列も作成可能。

a = []

アクセス

a = [1, 2, 3]
a[0] // => 1
a[3] // => nil

インデックスは0からがいい。ところでなんでLuaは1からなんだろうか。 範囲外(というか未代入)にアクセスするとnilが返る。

こういう書き方も許して欲しい。

[1, 2, 3][1] // => 2

配列に代入できるもの

事なる種類の値を同じ配列に入れることもできる。

a = [1, "hello", [1, 2, 3]]
a[2][2] // => 3

もらちろん多次元配列も!

配列操作関数

以下のような関数を用意したい。 言い方を変えれば配列はこのような操作ができるものであってほしい。

size

a = [1, 2, 3]
size(a) // => 3
size([1, 2]) // => 2

each

a = [1, 2, 3]
each(a, puts) // => 1
              // => 2
              // => 3

上記は以下と同じ意味。

a = [1, 2, 3]
each(a, fanction(e) { puts(e) })

map

a = [1, 2, 3]
a = map(a, to_s)
p(a) //=> ["1", "2", "3"]

flatten

a = [1, 2, [3, 4, 5]]
a = flatten(a)
p(a) //=> [1, 2, 3, 4, 5]

その他

  • map!, flatten! ... 破壊的に
  • push, pop, shift, unshift, delete ... これも破壊的か
  • sort, reverse, sort!, reverse!

ほんとはこう書きたいけどこれは難しいだろうしまた別の話やね。

a.size()
a.map(to_s)