0
0

More than 3 years have passed since last update.

Kinx ライブラリ - Range 追加機能

Posted at

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 に入れました。以下の記事にも追記(再掲)。

以上、ご報告でした。

0
0
0

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
0
0