RubyっぽいAPIを提供してくれるJavaScriptのライブラリはありませんか？


普段、Rubyを使い慣れているのでJavaScriptで配列やハッシュ、文字列等を操作するときに、「RubyでいうあのメソッドはJavaScriptにあるのかな？」と探す
or 実装するのが面倒です。

というわけでベーシックなオブジェクトをRubyっぽく操作できるJSライブラリがあれば教えてください。




Tetsuwo OISHIさんも書かれているように、RubyJSというライブラリがあります。
現在のバージョンは0.8.0-beta1という新しいものです。まだ知名度は低いかもしれませんが、Rubyライクなコーディングが好きな方にはよいかもしれません。

**RubyJS** <http://rubyjs.org/>

ドキュメントによると2つの使い方があるようです。

>   * RubyJS (Lite) - Functional
>   * RubyJS Classic - Object Oriented
>

先ずRubyJS (Lite)のほうは、Underscore.jsに似た関数スタイルで実装されているようです。

[code]

      String 関連の関数は、グローバルオブジェクトの　'_s' に、
      Array 関連の関数は、グローバルオブジェクトの　'_a' に、
      Time 関連の関数は、グローバルオブジェクトの　'_t' に、...
    
[/code]

という具合です。

一方、RubyJS Classic
の方は、Lite版の機能を'`R`'という名前のラッパーオブジェクトを使って実装しているようです。こちらの関数は、戻り値としてラッパーオブジェクト自身を返すようになっていて、メソッドチェーンを組むことができます。

[code]

      R("foo");   // => {R.String: "foo"}
      R("foo").capitalize(); // => {R.String: "Foo"}
      R("foo").capitalize().ljust(7, '-'); // => {R.String: "--Foo--"}
    
[/code]

* * *

# JavaScript / Underscore.js / RubyJS の比較

RubyJSの[ドキュメントページ](http://rubyjs.org/reloaded/#overview-
benefitsForJsDevelopers)に、純粋なJSとUnderscore.jsと書き方を比較するコードが載っています。その中から2つの部分を選んで以下に補足します。

## 比較1. 配列中の文字列を数値に変換

>
[code]

>      // JS
>      ['10', '10', '10'].map(parseInt)     // => [10, NaN, 2]
>      // underscore
>      _.map(['10', '10', '10'], parseInt)  // => [10, NaN, 2]
>      // RubyJS
>      _a.map(['10', '10', '10'], parseInt) // => [10, 10, 10]
>  
[/code]

このコードが言わんとしていることは、「JSやunderscoreでは配列中の文字列をまとめてparseIntできないけど、RubyJSなら簡単です。」ということだと思います。確かにそうですが、このままだとJSとunderscoreが言われっ放しで少しかわいそうな気もするので以下に補足してみます。

**純粋なJavascriptの場合**

Javascriptの`Array.map()` を使ってparseIntするときに、以下のように書くと予想外の結果になります。

[code]

     ['10', '10', '10'].map(parseInt);     // => [10, NaN, 2]
    
[/code]

これは、`parseInt()`関数の引数が1つではないことに起因しています。

>
[code]

>     var intValue = parseInt(string[, radix]);　//第2引数は基数（10進の場合は10）
>  
[/code]

>
> [Mozilla Developper
> Network](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)より引用

対処方法はいくつかありますが、そのひとつは`bind()`関数を使うものです。`bind()`の第2引数に基数10（10進数）を指定することができます。

[code]

     ['10', '10', '10'].map(parseInt.bind(null, 10));// => [10, 10, 10]
    
[/code]

あるいはもっとシンプルに、`parseInt()`の代わりに`Number()`を使う方法もあります。JavaScriptの`Number()`はラッパーオブジェクトですが、`new`演算子をつけないで呼び出すと型変換関数として動作します。

[code]

     ['10', '10', '10'].map(Number); // => [10, 10, 10]
    
[/code]

これならばシンプルですし、RubyJSと比べても見劣りしないと思います。

**Underscore.jsの場合**

Underscoreでは、デフォルトで`_`（アンダースコア）という名前のグローバルオブジェクトが定義されています。その`_`に実装されているmap関数を使って、配列にコールバック関数を関連付けます。上で述べたJSの場合と同様に、以下のどちらかの方法で数値化できます。

[code]

     _.map(['10', '10', '10'],parseInt.bind(null, 10));　 // => [10, 10, 10]
     _.map(['10', '10', '10'],Number);　 // => [10, 10, 10]
    
[/code]

**RubyJSの場合**

RubyJSでは、`_a`という名前のグローバルオブジェクトに配列関連のメソッドが定義されています。 以下のどちらの書き方もできます。

[code]

     _a.map(['10', '10', '10'], parseInt); // => [10, 10, 10]
     _a.map(['10', '10', '10'], Number); // => [10, 10, 10]
    
[/code]

確かにシンプルにコーディングできます。

* * *

## 比較2. 配列のソート

もうひとつの比較を見てみます。ここでは、配列を`sort()`するコードが載っています。

>
[code]

>     // JS
>     [1, 8, 15].sort()     // => [1, 15, 8]
>     // underscore
>     _.sortBy([1, 8, 15])  // => [1, 15, 8]
>     // RubyJS
>     _a.sort([1, 8, 15])   // => [1, 8, 15]
>  
[/code]

このコードが言わんとしていることは、「JSやunderscoreでは配列中の文字列を単純にソートきないけど、RubyJSなら簡単だよ」ということだと思います。更に解りやすくするために、数値を書き換えて以下のようにして考えます。

[code]

     // JS
     [33,4,1111,222].sort()     // =>  [1111,222,33,4]
     // underscore
     _.sortBy([33,4,1111,222])  // => [1111,222,33,4]
     // RubyJS
     _a.sort([33,4,1111,222])   // =>　[4, 33, 222, 1111]
    
[/code]

**純粋なJavascriptの場合**

Javascriptの`Array.sort()` を使って以下のようにすると、アルファベット順にソートされた結果が返ります。

[code]

     [33,4,1111,222].sort();     // => [1111,222,33,4]
    
[/code]

アルファベットではなく数値として比較したい場合には、以下のように書けます。

[code]

     [33,4,1111,222].sort(function(a,b){ return a - b;})); // => [4, 33, 222, 1111]
    
[/code]

**Underscore.jsの場合**

Underscoreでは、`sortBy()`を使って以下のようにできます。

[code]

     _.sortBy([33,4,1111,222], function(num){ return num; });// => [4, 33, 222, 1111]
    
[/code]

**RubyJSの場合**

[code]

     _a.sort([33,4,1111,222])// => [4, 33, 222, 1111]
    
[/code]

確かにシンプルです。

以上です。Rubyライクなコーディングが好きな方にはよいかもしれません。

上述のコードを[JSFiddle](http://jsfiddle.net/naokiota/24ceLxv7/1/)に置きました。

