The difference lies in the interpretation of the for comprehension, which can be seen as a DSL.
If there is a yield the comprehension will be translated to something using map and flatMap and collect the results.
If there is no yield the expression will be translated to something using foreach, iterating over all values ignoring the results.
While on the other hand is just a function that does something until a certain condition is met and returns nothing, i.e. Unit at the end.
It is just called for sied effects and not for returning results. Thus even if you use yield the result will be thrown away.
The implemention you have given above uses the the Iterator pattern and would work exactly like foreach does.
While returns Unit , like foreach :
scala> val res : Unit = (1 to 10) foreach {i => i + 1}
whereas for with yield returns a result and behaves like map.
scala> val res : Seq[Int] = (1 to 10) map {i => i + 1}
res: Seq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
scala> val res = for (i<- 1 to 10) yield i +1
res: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)