新しいindexのまとめ

ver0.6.2から変わりました。
.{n}はindex_safe。アクセス不可の場合にNilを返す。index(.[])はエラーになる。Mapの場合はindexは新しくmappingするが、index_safeはしない。

{0 1 2}.{1} //1
{0 1 2}.{3} //Nil
{0 1 2}.{-1} //2
{0 1 2}.{-3} //Nil

.{n} = vはindex_set_safe。アクセス不可の場合にvを詰める。マイナス値が与えられた場合、前部を詰め、それらしく機能する。

a: {0 1} a.{1} = 3 a//{0 3}
a: {0 1} a.{3} = 3 a//{0 1 3 3}
a: {0 1} a.{-2} = 3 a//{3 1}
a: {0 1} a.{-3} = 3 a//{3 0 1}

Object.?が条件値をキャストするようになったので、n.< self.size.?とやっていたのを、簡易にself.{n}.?やself.{n}.nil?.?とできるようになった。当然、self.{n}がfalseの場合や、Nilの場合にはアクセス不可時との区別は付かない。簡潔なほど曖昧になる。

{}.{0}.? true //Nil
{Nil}.{0}.? true //Nil
{0}.{0}.? true //0
{1}.{0}.? true //1

{}.{0}.nil?.? true //true
{Nil}.{0}.nil?.? true //true
{0}.{0}.nil?.? true //false
{1}.{0}.nil?.? true //false

.{n len}はslice_safeになるが、sliceのシノニム。slice, slice_safeについては別項(v0.6.5)

以下、safeに限らないこと。
.[Range]は、.slice(Range.begin Range.end.- (Range.begin))と扱われる。Range.endがマイナスの場合は.slice(Range.begin Range.end)

{0 1 2 3}.{2 2} //{2 3}
{0 1 2 3}.{2...4} //{2 3}
{0 1 2}.{1...2} //{1}
{0 1 2}.{0...-1} //{0 1}
{0 1 2}.{0..-1} //{} //0..-1は0...0になる

sliceにNilはself.sizeとして扱われる。

{0 1 2 3}.{1 Nil} //{1 2 3}
{0 1 2 3}.{Nil Nil} //{}

.[a.@]も可能になった。引数が1つならindex, 複数ならsliceに動的(非パース時)になる。