Generator今回はIteratorやGeneratorに対して抽象的な操作をしていくことで、generatorへの理解を深めたいと思います。Iterableを対象にIteratorを返すような関数を作っていきます。書くと難しく感じるかもしれませんがArrayに対してのmapやfilterのようにIterableに対してのmapやfilterなどを作っていきます。補足TypeScriptの型の上ではIteratorとIterableIteratorが分かれていますが、このブログ上でのIteratorは全てIterableIteratorを考えてください。operator今回、いろいろな関数を実装していくうえで既存のJavaScript実行エンジンでは実装されていないシンタックスを使います。それは::という演算子で普段bind演算子と呼ばれていることが多いと思います。JavaScriptは関数を呼び出すときにthisとなるものをcallやapplyやbindで変えることができますが、それらのシンタックスシュガーとなるので::は機能的には今までのものと変わりません。fが呼び出された時のthisはobjになり57が出力されます。obj::fとf.bind(obj)も同様に等しいです。以下のリンクは仕様になります。Syntaxなお、今回実行するコードはこちらで試すと良いかもしれません。余談bind演算子はまだまだアイデアレベルでECMAScriptに入るかどうか解らないですが個人的には非常に重要で必要となるものと考えています。ある関数fはあるcontextをthisに取ることができるという形で関数をつくっていくと互いに素なライブラリを作ることができます。以下のように第一引数にcontextを取るような関数にもできますが、bind演算子を使うことによって可読性を上げることができると考えています。c);Operatortake前回のブログにあったtakeについて考えてみましょう。以下のtakeはthisの型がIterableであるとき呼ぶことができます。iterable::take(4)のような形式になります。}}ここでif(){return}の位置について考えることは非常に重要です。}}下の記述はtake(x)とした時にthis.next()がx+1回呼ばれてしまいます。Error();}()::take(0)]ではエラーを吐いてしまいます。どちらがいいかは主観になってしまいますがtakeの意味合いを考えた時に僕は上のほうがいいと思います。前回のブログの回答例を書くので試してみましょう。[1,1,2,3,5]余談ですがこのfibが返すIteratorは無限の長さを持っているのでArray.from(fib())としてしまうと無限ループになってしまいます。このように無限の長さのリストのように扱えることもIteratorの魅力です。reducemap、filter、reduceは以下のように書くことができます。reduceはIterableに対してRを返すのでGeneratorでは書く必要はありません。問題にしておくので、矢印で囲まれた範囲を変えてみてください。まとめこれらの関数はIteraor用ではなくIterable用に作っています。Generatorをつかって作ったIteratorはIterableであることを利用すると、IterableなArray,String,Map,Setに対して使うことができるようになります。IterableやそれをつくりだすGenerator、そしてbind演算子を利用することによって「thisがどのようなインスタンスなのか」ということや「メソッドが実装されていること」を気にする必要はありません。GeneratorこのようにIterableに抽象的な操作ができるのですが、すこし不便なところがあります。以下のコードの例を見てください。a0,a1,b0,b1の違いを考えてみましょう。実行してみるとfalseになると思います。b1はtrueになります。これはreduceをした時にfibIteratorの状態が変わってしまうからです。このようにIteratorとして扱うことで遅延評価ができるようになりましたが、内部の値を取り出す時にIteratorはミュータブル(状態が変更可能)なので扱うときに意識する必要があります。イミュータブルに扱ってみましょう。Operatorイミュータブルで扱うためにはどうするのが良いでしょうか?前回のブログにあったrangeRepeatを思い出してください。関数の中でrangeを呼んでいたと思いますが、rangeという関数は関数を読んだ時にIteratorを返すので関数のまま操作すればイミュータブルと考えることができます。Generator関数自体に操作を加えてみましょう。Iteratorです。n);}実はreduceGはあまり実装する必要が無いため、下記のコードには含まれていません。今回、何のためにGeneratorに対するオペレーターを実装しているかを考えてみましょう!repeat指定した回数だけrepeatしてくれるようなオペレーターをIterableに対して実装することは難しいですが、Generatorに対しては簡単になります。//repeatG()やtakeG()が返すものがGenerator!まとめGeneratorのまま扱うことで便利なこともありますが、あるGeneratorが毎回結果の違うIteratorを返してくる場合は予想外の挙動になることもあります。generatorでない)。イミュータブルに扱うと状態を考えることが減るのでコーディングの速度は上がるかもしれませんよ!問題1上に書いたreduce(accumulator)を実装して見てください。x))1001216hiroqnLv.3EXP.521もちろん、javascriptにjavascriptで立ち向かってもいいさ。javascriptがありゃ何にでも立ち向かえるだろう。ゼクシィiOSアプリの場合2020.02.142020.02.07レガシーソフトウェアをチームで改善するためにまずしたこと2020.02.072020.01.20XcodeGenでiOSチーム開発でのストレスを軽減する2020.01.20サイト利用についてお問い合わせ採用情報リクルートグループサイトへ。