2011-05-17 19 views
7

tratando de ejecutar el código de muestra en el libro de Apress llamado "Beginning Scala". Incluso descargué el código de su sitio web para asegurarme de que no lo hice. Recibiendo el siguiente mensaje:código de error en el código de ejemplo de "Beginning Scala"

/root/sum.scala:19: error: missing arguments for method collect in trait Iterator; 
follow this method with `_' if you want to treat it as a partially applied function 
val lines = input.getLines.collect 
         ^
one error found 

y aquí está el código fuente que utilicé (que ejecuta la versión Scala 2.8.1.final (Java HotSpot (TM) Server VM, Java 1.6.0_22 en Fedora 13)

import scala.io._ 

def toInt(in: String): Option[Int] = 
    try { 
    Some(Integer.parseInt(in.trim)) 
    } catch { 
    case e: NumberFormatException => None 
    } 

def sum(in: Seq[String]) = { 
    val ints = in.flatMap(s => toInt(s)) 
    ints.foldLeft(0)((a, b) => a + b) 
} 

println("Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)") 

val input = Source.fromInputStream(System.in) 

val lines = input.getLines.collect 

println("Sum "+sum(lines)) 

se parece a esto es el cambio relevante:..

el método Iterator.collect() en 2.7.7 devuelve un Seq en 2.8, que se utiliza para realizar un mapa condicional utilizando una función parcial puede use input.getLines.toSeq en lugar.

+0

Esto no es cierto en muchas maneras para que responda a través de mi teléfono. Como una solución rápida y sucia, intente simplemente eliminar el '.collect' al final de esa línea. –

Respuesta

14

Ah, recuerdo esto:

EDITAR: reemplazado con más profundidad en respuesta

El código fue escrito en contra Scala 2.7.3 y 2.8 introduce algunas de ruptura cambios.

Aquí es una actualización del código que obras bajo Scala 2.8.0:

import scala.io._ 

object Sum { 
    def main(args: Array[String]): Unit = { 
    println("Enter some numbers and press ctrl-D (Unix/Mac) ctrl-Z (Windows)") 
    val input = Source.fromInputStream(System.in) 
    val lines = input.getLines.toList 
    println("Sum " + sum(lines)) 
    } 

    def toInt(s: String): Option[Int] = { 
    try { 
     Some(Integer.parseInt(s)) 
    } catch { 
     case e: NumberFormatException => None 
    } 
    } 

    def sum(in: Seq[String]): Int = { 
    val ints = in.flatMap(toInt(_)) 
    ints.foldLeft(0)((a, b) => a + b) 
    } 

} 

Fuente: http://scala-programming-language.1934581.n4.nabble.com/Beginning-Scala-book-problem-td2966867.html

+2

+1: Desafortunadamente, los idiomas evolucionan más rápido que los libros. –

+3

parece que este es el cambio relevante: el método Iterator.collect() en 2.7.7 devuelve un Seq. En 2.8, se usa para realizar un mapa condicional usando una función parcial. En su lugar, puede usar input.getLines.toSeq. – Ramy

+0

¿No es^Z en Windows, no^C? – vy32

Cuestiones relacionadas