@okayuの大して技術的ではないブログ

はじめに

for i in range(10):  
  print(i)  
  # かっこいい  

理屈はいいから早く見せろ!

/**  
 * @param  {...number} args  
 */  
const range = (...args) => {  
  function* rangeGen(from = 0, to = Infinity, step = 1) {  
    for (let v = from; v < to; v += step) {  
      yield v;  
    }  
  };  

  return args.length === 0  
    ? rangeGen(undefined, undefined, undefined)  
    : args.length === 1  
    ? rangeGen(undefined, args[0], undefined)  
    : args.length === 2  
    ? rangeGen(args[0], args[1], undefined)  
    : rangeGen(...args);  
}  

for (const v of range(2, 10)) {  
  console.log(v);  
  // 2 ~ 9までが順番に出力される  
}  

何やってんだよ???

range関数はジェネレータ関数を実行した結果を返します。引数をジェネレータ関数に振り分けるだけのラッパーです。
rangeGenがジェネレータ関数です。

  1. ジェネレータってなんだよ
    • ES2015で追加されたJavaScriptの比較的新しい機能です
  2. 何をジェネレートすんだよ
    • 反復可能オブジェクトをジェネレートします
  3. 反復ってなんだよ
    • for-of
    • スプレッド構文(...iterator)
    • 分割代入(const [hoge, huga] = iterator;)
    • とかです。多分
  4. 配列じゃだめなの?
    • 無限を扱えます

詳しいジェネレータ関数の使い方は、各位ググるなりMDN読むなりしてください。

とりあえずここでは、fromからtoまでの数字を列挙することのできるやつを作っています。

おわりに

これでJavaScriptでもfor (const i of range()) {できます。

この記事へのコメント

まだコメントはありません