Kinx ライブラリ - String

# String

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。言語はライブラリが命。ということでライブラリの使い方編。 

今回は String です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。 

文字列操作の基本インターフェース。String オブジェクトに括り付いたメソッドは特殊メソッド（と呼ぶメソッドがある、名前は今決めた）扱いで、文字列オブジェクトに直接作用させることができる。

## String 特殊オブジェクト

特殊メソッドを持つオブジェクトを特殊オブジェクトと呼び（←今決めた）、String、Array、Integer、Double、Binary がある。特殊メソッドは、特殊オブジェクトが対象としているオブジェクト（String なら文字列）に対して直接作用させることができる。

例えば、以下のように関数定義してみよう。

```javascript
String.greeting = function(name) {
    System.println("Hello, I am %{name}.");
};
```

すると、以下のように書くことができるようになる。

```javascript
"John".greeting();
```

実行してみよう。

```
Hello, I am John.
```

使い方によっては便利。ただし、**ライブラリの追加（組み込み特殊メソッドの追加）で使う可能性がある** ので乱用はあまりしないほうが良いかもしれない。

## String

### 組み込み特殊メソッド


|              メソッド               |                                                             意味                                                             |
| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| String.startsWith(str)              | 文字列が `str` で始まれば true。                                                                                             |
| String.endsWith(str)                | 文字列が `str` で終れば true。                                                                                               |
| String.find(str)                    | 文字列の中で `str` が見つかった位置（0～）を返す。見つからなかった場合は -1 を返す。                                         |
| String.subString(str, start[, len]) | `str` の部分文字列を返す。                                                                                                   |
| String.replace(str, cond, repl)     | `str` から `cond` にマッチする部分を全て `repl` に置換する。`cond` は文字列または正規表現オブジェクトの指定が可能。          |
| String.toInt(str)                   | `str` を整数値に変換する。                                                                                                   |
| String.toDouble(str)                | `str` を実数値に変換する。                                                                                                   |
| String.parentPath(str)              | `str` をパスと認識し、親パスとなる部分文字列を返す。例）`"ab/cd/ef.x".parentPath()` → `"ab/cd.x"`                            |
| String.filename(str)                | `str` をパスと認識し、親パス部分を削除したファイル名部分文字列を返す。例）`"ab/cd/ef.x".filename()` → `"ef.x"`               |
| String.stem(str)                    | `str` をパスと認識し、ファイル名の stem 部分文字列を返す。例）`"ab/cd/ef.x".stem()` → `"ef"`                                 |
| String.extnsion(str)                | `str` をパスと認識し、ファイル名の拡張子部分文字列を返す。例）`"ab/cd/ef.x".extnsion()` → `".x"`                                 |
| String.split(str, sep)              | `str` を `sep` を区切り文字として分割し、配列として返す。`sep` は文字列、または正規表現オブジェクトの指定が可能。            |
| String.each(str, callback)          | `str` を 1 文字ずつ分割し、それを引数にして `callback` 関数を呼び出す。`callback` 関数の第 2 引数に index (0～) も渡される。 |

`each` は現在残念ながら日本語はうまく分割してくれないので注意。正式リリースまでに UTF-8 対応はさせる予定。

### 特殊オペレーター

#### `/` オペレーター

文字列に対して `/` オペレーターを適用した場合、`/` で連結した文字列を返す。その際、重複したセパレータは 1 つになる。

```javascript
var a = "aa/bb" / "ccdd";   // => "aa/bb/ccdd"
var b = "aa/bb/" / "ccdd";  // => "aa/bb/ccdd"
var c = "aa/bb" / "/ccdd";  // => "aa/bb/ccdd"
```

#### `=~` オペレーター

文字列に対して `=~` を適用した場合、右辺値には正規表現オブジェクトを期待する。正規表現のオブジェクトではなかった場合、例外が送出される。

#### `!~` オペレーター

文字列に対して `!~` を適用した場合、右辺値には正規表現オブジェクトを期待する。正規表現のオブジェクトではなかった場合、例外が送出される。


#### 後置 `[]` オペレーター

文字列に対してインデックスアクセスをした場合、その位置にある文字コードを整数値で返す。したがって、「5 文字目が `'a'` である」という判断をする場合は以下のように書く。

```javascript
if (str[5] == 'a'[0]) {
    /* ... */
}
```

ちょっと C と違うことに注意。文字 'a' は文字ではなく **文字列リテラル** のため、最初の文字を示す `[0]` が必要。

#### 単項 `*` オペレーター

単項 `*` オペレーターを文字列に適用した場合、文字列を配列に変換する。

```javascript
var a = *"abc";  // => [97, 98, 99]
```

尚、補足として配列に単項 `*` オペレーターを適用すると、文字列に戻ってくる。

## おわりに

文字列操作を簡単にしたいがためにスクリプト言語を使う、というのもよくあるシーン。そもそもコレ系スクリプトの元祖的な位置付けである Perl はテキスト処理が楽、ということで使われてた経緯もありますし。そういう意味で、文字列操作はプリミティブですが重要な機能。テキスト処理は C で書きたくない処理の一つですね。

ではまた次回。