2016-07-03 9 views
1

このプログラムはstdioからいくつかの番号(改行のそれぞれの番号)を読み込みます。私は数字を一度しか入力しない! ここで、値 "it"は(lazy valとは対照的に)定義ポイントで評価され、 "it"はRHSの結果で置き換えられるべきです。stdioからscalaを読み込み中に評価する

最初のprintln(it.size)が呼び出されるときまでに、「it」は既に評価されています。それではなぜprinlnへの2回目の呼び出しは常にゼロを返しますか? stdioから再び読み込みを試みるように見え、何も読み込まれていないのでゼロを返します。

object Test { 
    def main(args: Array[String]) { 
     val it= io.Source.stdin.getLines().map(_.toInt) 
     println(it.size) // prints correct number of lines 
     println(it.size) // prints zero always???? 
    } 
} 

答えて

1

なぜprinlnする2番目の呼び出しは常にゼロ

を返さないSource.getLinesはイテレータだそれに達したことを意味する、あなたがit.sizeの呼び出しで完全に反復しているIterator[String]を返すので終わり。 This is how size is defined on TraversableOnce[A]Iterator[A]が伸びる):あなたが複数回反復することができるようにしたい場合は、最初のイテレータを実体化する必要があります

def size: Int = { 
    var result = 0 
    for (x <- self) result += 1 
    result 
} 

def main(args: Array[String]): Unit = { 
    val it = io.Source.stdin.getLines().map(_.toInt).toSeq 
    println(it.size) 
    println(it.size) 
} 

注意このマテリアがに全体イテレータを引き起こしますメモリにロードされます。

+0

Ahaなので、size関数はイテレータの状態を変換します。私はそれが整数を返すだけであり、イテレータを変更しないままにしていると思いました。ありがとう:) – Samar

関連する問題