Uso di yield con while ?

3 views
Skip to first unread message

Francesco Bochicchio

unread,
Jul 16, 2009, 12:45:27 PM7/16/09
to sug-it
Ciao a tutti,

che voi sappiate è possibile usare yield all'interno di un ciclo
while?

Ho tentato di fare qualcosa del genere:

def process_lines ( fname : String ) = {
val bf = new BufferedReader( new FileReader(fname) )
var line = bf.readLine()
while ( line != null ) {
yield line
line = bf.readLine()
}
}

Ma non funziona. L'idea era di separare la logica di scansione del
file da quella di processing. Alla fine ho risolto cosi:

def process_lines ( fname : St: ring, f (String)=> Unit ) = {
val bf = new BufferedReader( new FileReader(fname) )
var line = bf.readLine()
while ( line != null ) {
f(line)
line = bf.readLine()
}
}

ma mi è rimasto il dubbio se il primo metodo non possa funzionare ...

Ciao
-----
FB



gabriele renzi

unread,
Jul 17, 2009, 3:15:49 AM7/17/09
to sug...@googlegroups.com
On Thu, Jul 16, 2009 at 6:45 PM, Francesco Bochicchio<bief...@gmail.com> wrote:
>
> Ciao a tutti,
>
> che voi sappiate è possibile usare yield all'interno di un ciclo
> while?

nope, sarebbe l'equivalente di usare un continue dentro un if, non
vale sintatticamente

> Ho tentato di fare qualcosa del genere:
>
>  def process_lines ( fname : String ) = {
>    val bf = new BufferedReader( new FileReader(fname) )
>    var line = bf.readLine()
>    while ( line != null ) {
>      yield line
>      line = bf.readLine()
>    }
>  }
>
> Ma non funziona.  L'idea era di separare la logica di scansione del
> file da quella di processing.

purtroppo lo yield in scala non funziona così, è solo un pezzo della
for comprehension

> Alla fine ho risolto cosi:
>
>  def process_lines ( fname : St: ring, f (String)=> Unit ) = {
>    val bf = new BufferedReader( new FileReader(fname) )
>    var line = bf.readLine()
>    while ( line != null ) {
>      f(line)
>      line = bf.readLine()
>    }
>  }
>
> ma mi è rimasto il dubbio se il primo metodo non possa funzionare ...


vedi sopra, yield confonde perché si chiama come il costrutto di
ruby/python/c# ma in realtà non c'entra molto, è solo syntax sugar
nelle for comprehension.

Comunque io.Source e io.Source.getLines ti dannno degli Iterable
quindi forse non ti serve :)

Francesco Bochicchio

unread,
Jul 17, 2009, 7:55:41 AM7/17/09
to sug-it


On Jul 17, 9:15 am, gabriele renzi <rff....@gmail.com> wrote:
>
> Comunque io.Source e io.Source.getLines ti dannno degli Iterable
> quindi forse non ti serve :)

Grazie, avevo dato un occhiata a scala.io, ma non avevo pensavo che
Source potesse servire a
scandire file di testo.

Guardando il sorgente di source ho approfondito anche il 'protocollo
iteratori' in Scala,
che era quello a cui miravo con il mio esercizio.

Ciao
-----
FB

gabriele renzi

unread,
Jul 17, 2009, 8:24:49 AM7/17/09
to sug...@googlegroups.com
2009/7/17 Francesco Bochicchio <bief...@gmail.com>:

>
>
>
> On Jul 17, 9:15 am, gabriele renzi <rff....@gmail.com> wrote:
>>
>> Comunque io.Source e io.Source.getLines ti dannno degli Iterable
>> quindi forse non ti serve :)
>
> Grazie, avevo dato un occhiata a scala.io, ma non avevo pensavo che
> Source potesse servire a
> scandire file di testo.


Source è il kitchen sink dell'input, da quel che ho visto. Non mi
piace moltissimo, specie perché non c'è un equivalente output ma
meglio che new X( new Y(new Z))) :)

> Guardando il sorgente di source ho approfondito anche il 'protocollo
> iteratori' in Scala,
> che era quello a cui miravo con il mio esercizio.

E non ci racconti niente? :)

Francesco Bochicchio

unread,
Jul 17, 2009, 3:10:45 PM7/17/09
to sug-it


On Jul 17, 2:24 pm, gabriele renzi <rff....@gmail.com> wrote:
> 2009/7/17 Francesco Bochicchio <bieff...@gmail.com>:
>

> > Guardando il sorgente di source ho approfondito anche il 'protocollo
> > iteratori' in Scala,
> > che era quello a cui miravo con il mio esercizio.
>
> E non ci racconti niente? :)

Pensavo che qui foste tutti 'guru' di Scala :-)
Comunque ecco il mio stupidissimo primo iteratore (P:S : lo so che si
può fare
la stessa cosa con "n to m" :-)

Mi pareva strano che non ci fosse modo di creare un iteratore da usare
col for (quello che cercavo di fare con
yield) ... ma non ricordo di aver trovato descritto il mixin Iteraror
in "programming Scala", e per ora non ho niente di
cartaceo ...

// Iteratore: occorre definire hasNext e next
class MyIterator (min:Int, max:Int) extends Iterator[Int] {

var _count = min;

def hasNext = _count <= max;

def next : Int = {
_count += 1;
return _count-1;
}
}

// Test
object ProvaIteraror {
def main(args:Array[String]) = {
for ( n <- new MyIterator( 2, 12 ) ) println(n)
}
}



Reply all
Reply to author
Forward
0 new messages