Range 追加機能
以前の以下の記事にも同じ内容を追記しました。
添え字 for String, Binary, Array, and Range
これら 4 種類のオブジェクトに対して、配列インデックス形式の添え字指定に Range
を使用できるようにしました。下記の説明は、Range for Range 以外は対象が違うだけで ほとんど同じ です。
Range for String
通常の文字列への要素アクセスは、その位置の文字コードを返す。
var str = "abcdefghijklmnopqrstuvwxyz";
System.println(str[25]); // 122
System.println(*str[25]); // 'z'
Range オブジェクトを引数に渡した場合、その範囲の部分文字列を返す。String#subString()
の代わりになるが、String#subString()
は長さを指定するので、並べてみると以下のような感じ。
var str = "abcdefghijklmnopqrstuvwxyz";
System.println(str[2..25]); // "cdefghijklmnopqrstuvwxyz"
System.println(str[2...25]); // "cdefghijklmnopqrstuvwxy"
System.println(str.subString(2, 23)); // "cdefghijklmnopqrstuvwxy"
Range for Binary
通常のバイナリへの要素アクセスは、その位置の 1 バイトの数値を返す。
var bin = <0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f>;
System.println(bin[11]); // 11
Range オブジェクトを引数に渡した場合、その範囲の部分バイナリを返す。Binary#subBinary()
の代わりになるが、Binary#subBinary()
は長さを指定するので、並べてみると以下のような感じ。
var bin = <0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f>;
System.println(bin[2..12]); // <0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c>
System.println(bin[2...12]); // <0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b>
System.println(bin.subBinary(2, 10)); // <0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b>
Range for Array
通常の配列への要素アクセスは、その位置の要素を返す。
var ary = 16.times();
System.println(ary[11]); // 11
Range オブジェクトを引数に渡した場合、その範囲の部分配列を返す。Array#subArray()
の代わりになるが、Array#subArray()
は長さを指定するので、並べてみると以下のような感じ。
var ary = 16.times();
System.println(ary[2..12]); // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
System.println(ary[2...12]); // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
System.println(ary.subArray(2, 10)); // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Range for Range
通常の Range オブジェクトへの要素アクセスは、その位置の要素を返す。ちなみに一度 toArray()
してしまうので破壊的だが、内部に toArray()
結果を持っておくことで再度 []
を適用できるようにはしてある。
var range = 0..16;
System.println(range[11]); // 11
Range で指定すると以下の通り。toArray()
の結果は保持されているので、別の Range オブジェクトで範囲指定しても正しくその範囲を取ることはできる。
var range = 0..16;
System.println(range[2..12]); // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
System.println(range[2...12]); // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
まとめ
プレビュー 0.5.2 に入れました。以下の記事にも追記(再掲)。
以上、ご報告でした。