2016-07-14 4 views
0

私は近年web devのブートキャンプを卒業しており、現在Eloquent Javascriptで作業しています。この運動の前に、物事はかなりスムーズに動いていました。誰かが私のためにこれを壊すことができますか?私はなぜ開始位置が各シーケンスの "-1"に設定されているのかよく分かりません。Eloquent Javascript Exercise 6.3 - シーケンスインターフェイス

ここに質問があります: 値のコレクションで反復を抽象化するインターフェイスを設計します。このインタフェースを提供するオブジェクトはシーケンスを表し、インタフェースは何らかの形でこのようなオブジェクトを使用するコードがシーケンスを反復することを可能にしなければならず、要素値を見て、配列の終わりに達する。

インターフェイスを指定したら、シーケンスオブジェクトを受け取り、最初の5つの要素でconsole.logを呼び出すlogFive関数を記述してください。

次に、配列をラップするオブジェクト型ArraySeqを実装し、設計したインターフェイスを使用して配列全体を反復することができます。代わりに整数の範囲(そのコンストラクタへの引数からの引き数)を反復する別のオブジェクト型RangeSeqを実装します。

とソリューション:

function logFive(sequence) { 
    for (var i = 0; i < 5; i += 1) { 
     if (!sequence.next()) { 
      break; 
     } 
     console.log(sequence.current()); 
    } 
} 
function ArraySeq(array) { 
    this.pos = -1; 
    this.array = array; 
} 
ArraySeq.prototype.next = function() { 
    if (this.pos >= this.array.length - 1) { 
     return false; 
    } 
    this.pos += 1; 
    return true; 
} 
ArraySeq.prototype.current = function() { 
    return this.array[this.pos]; 
} 
function RangeSeq(from, to) { 
    this.pos = from - 1; 
    this.to = to; 
} 
RangeSeq.prototype.next = function() { 
    if (this.pos >= this.to) { 
     return false; 
    } 
    this.pos += 1; 
    return true; 
} 
RangeSeq.prototype.current = function() { 
    return this.pos; 
} 

logFive(new ArraySeq([1, 2])); 
// → 1 
// → 2 
logFive(new RangeSeq(100, 1000)); 
// → 100 
// → 101 
// → 102 
// → 103 
// → 104 
+0

位置が最初に-1に設定されている理由は? – user1620220

答えて

1

位置が最初にあなたは、このようなコードを書くことができるように-1に設定されています:JavaScriptのような0ベースの配列を持つ言語で

while (iter.next()) 
    console.log(iter.current()); 

を、0最初の項目を指しているので、配列が空の場合には別の値が必要で、-1が便利です。

+0

しかし、次に、 'array.length -1'(配列の最後のインデックス)までシーケンス内に余分な繰り返しがない限り、すべての繰り返しで位置に '1'を加えたら? –

+0

いいえ、この条件 'this.pos> = this.array.length - 1'は' next() 'に' false'を返し、ループを中断させるためです。 – user1620220

+0

多分、私はコードだけでなく、私が思ったことを理解していません。最初のパスで 'console.log(sequence.current())'が呼び出されると 'this.array [this.pos]'を返します。これは 'this.array [-1]'でしょうか?配列の最後のインデックスを返さないでしょうか?範囲では '100'ではなく' 99'を返しませんか? –

0

0を生成できないthis.pos += 1;を使用するためです。

関連する問題