ラノゲMVでlinq.jsを試してみる

はいどーもこんばんはニートです。
ラノゲMVにはlinq.jsが標準で付属しています
linq.jsってなんやねんというと、C#なんかでよく使われてる機能を模したものですね。
この辺は各自でググってください。
今回の記事ではこのlinq.jsについてアレコレ書いてみたいと思います(以前も少し書いてます)。

VNMMVでのLINQ

最初にぶっちゃけます。
VNMMVについているlinq.jsはしょぼいです!w
おそらくVNMMVの開発元が独自に作ったlinq.jsだと思うのですが(違ったらすみません)、僕が以前に利用したlinq.jsと違ってEnumerableクラスがまず存在しません。
代わりに、Arrayクラスに完全に統合されています。
まずこの時点で非常に使いにくい&提供されているインテリセンスが働かないのでめんどくさいことこの上ないのですが、一部の機能がバッサリと切り捨てられています
まだサラッとしか見ていませんが、例えばaverageメソッドは存在しませんし、LINQのキモとも言うべき遅延実行という概念もなくなっているのではないかなーと思います(つまり即時実行のみ)。

使ってみる

まずは簡単なサンプルコードをご覧ください。

//LINQ
let numbers = Array.range(1, 1000);
console.log(numbers);

もしも遅延実行という概念があるなら、このrange()した時点では配列は作られないはずなのですが、残念ながら配列は作成されてしまいます(即時実行)
つまり上記のコードはnumbers配列に1から1000までの値を代入します(indexが1増えるたびに値も1増加)。

もう少し実用的な例も見てみましょう。

let numbers = Array.range(1, 1000)
.where(n => n % 2 === 0)
.where(n => n.toString().contains('4'));
console.log(numbers);

上記のコードはまず1から1000までの値とindexを持つ配列を作成しています。
次にwhereメソッドで内容を絞り込みます。
メソッドの中身がRMMVユーザーには何やら見慣れない表記になっていますが、これは単なる関数(アロー関数)です。
function (n){return n % 2 === 0}と書いても全く同じ意味になります。
ただ長ったらしくてめんどくさいので普通はアロー関数を使います。

さてnが受け取るのは各配列の値です。
つまりここでは1から1000です。
それを一つ一つアロー関数に渡していき、trueになったものだけが配列として残ります
ここでは偶数が残ることになりますね。

その後さらにwhereメソッドで絞り込みます。
今度はnで受け取った数値を文字列に変換し、その文字列が「4」という値を含んでいるかどうかを判定しています。
先ほどと同じくtureなら残り、falseなら配列からは消えます。

そして最終的に残ったものがnumbersの配列となります。

破壊的メソッドかどうか

「このLINQは即時実行されるようだが、破壊的なのか?」という点も気になるかなと思います。
結論から言うと、おそらくは非破壊的です(まだ一部しか試していません)。
例えば先ほどのコードに以下のようなコードを追加してみてください。

let newNums = numbers.orderByDescending(n => n);
console.log(numbers);
console.log(newNums);

もしもorderByDescendingメソッド(コレクションの要素を降順に並び替えます)が破壊的ならば、numbersの並びが変わるはずです。
しかし結果は「numbersの並びは変わらず、newNumsには降順にソートされた結果が代入されている」というものになります。
つまりLINQの機能は破壊的ではありません。
単に新しい配列を返すだけです。

まとめ

VNMMVのLINQをざっと眺めてみましたが、いかがでしたでしょうか。
色々と書いていますが、実は僕もほとんどLINQは触ったことがありませんw
LINQはコレクションを操作するのに非常に便利なようですので、もう少し実践的な使い方も書けたらなあと思っています。

ほなそんな感じでまた。

フォローする