ошибка кода в примере кода из «Beginning Scala» - PullRequest
7 голосов
/ 18 мая 2011

пытается запустить пример кода в книге Apress под названием «Начало 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

и вот исходный код, который я использовал (работает под Scala версии 2.8.1.final (серверная виртуальная машина Java HotSpot (TM), Java 1.6.0_22 в 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))

похоже, что это соответствующее изменение:

Метод Iterator.collect () в 2.7.7 возвращает Seq. В 2.8 он используется для выполнения условной картыиспользуя PartialFunction. Вместо этого вы можете использовать input.getLines.toSeq.

1 Ответ

14 голосов
/ 18 мая 2011

Ах, я помню это:

РЕДАКТИРОВАТЬ : заменено более подробным ответом

Код был написан для Scala2.7.3 и 2.8 вносит некоторые критические изменения.

Вот обновление кода, работающего под 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)
  }

}

Источник: http://scala-programming-language.1934581.n4.nabble.com/Beginning-Scala-book-problem-td2966867.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...