2014-11-02 49 views
1

我从代码“斯卡拉深入”,在交互式编辑器的工作原理:斯卡拉平行设置递归值需要类型

(1 to 1000).par map { _ => Thread.currentThread.toString } toSet 

这将打印一组与用于此并行运行的线程。所有的伟大工程,结果类型为PARSET [字符串]

但后来我尝试在代码中使用它,我有这样的:

val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 
//val x = pthr.toSet 
println("thread = " + pthr) 

此抛出:“错误:PTHR需要类型的递归值”在println行。另一个观察是,当我取消注释第二行一切工作正常,结果是ParSet()。

这是怎么回事?什么是一种变量“pthr”?

+0

使用它与点,没有空格和...问题解决 – billpcs 2014-11-02 15:16:26

+0

什么意思,“这引发:”错误:递归值pthr需要类型“ ?你是说你正在执行该代码时正在抛出一个异常,还是你说编译器正在“抛出”这样的错误? – 2014-11-02 15:19:17

回答

0

println方法需要一个字符串,并且您已经向pthr提供了一个带有+运算符的字符串。为了将pthr转换为字符串,编译器需要知道它是哪种类型。你没有在你的pthr声明中提供一个类型,而是让它被推断出来。无论出于何种原因,推理都不起作用,因此编译器正在请求显式类型声明。你可以简单地做到这一点:

val pthr : Set[String] = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 

这应该照顾它。

但是,我无法用Scala 2.11.2重现您的结果。我得到:

比使用 toSet方法作为后缀运算符的
scala> val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 
<console>:7: warning: postfix operator toSet should be enabled 
by making the implicit value scala.language.postfixOps visible. 
This can be achieved by adding the import clause 'import scala.language.postfixOps' 
or by setting the compiler option -language:postfixOps. 
See the Scala docs for value scala.language.postfixOps for a discussion 
why the feature should be explicitly enabled. 
     val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 
                      ^
pthr: scala.collection.parallel.immutable.ParSet[String] = ParSet(Thread[ForkJoinPool-1-worker-29,5,main], Thread[ForkJoinPool-1-worker-19,5,main], Thread[ForkJoinPool-1-worker-13,5,main], Thread[ForkJoinPool-1-worker-3,5,main], Thread[ForkJoinPool-1-worker-27,5,main], Thread[ForkJoinPool-1-worker-5,5,main], Thread[ForkJoinPool-1-worker-1,5,main], Thread[ForkJoinPool-1-worker-23,5,main], Thread[ForkJoinPool-1-worker-15,5,main], Thread[ForkJoinPool-1-worker-11,5,main], Thread[ForkJoinPool-1-worker-21,5,main], Thread[ForkJoinPool-1-worker-9,5,main], Thread[ForkJoinPool-1-worker-7,5,main], Thread[ForkJoinPool-1-worker-17,5,main], Thread[ForkJoinPool-1-worker-31,5,main], Thread[ForkJoinPool-1-worker-25,5,main]) 

scala> println("thread = " + pthr) 
thread = ParSet(Thread[ForkJoinPool-1-worker-29,5,main], Thread[ForkJoinPool-1-worker-19,5,main], Thread[ForkJoinPool-1-worker-13,5,main], Thread[ForkJoinPool-1-worker-3,5,main], Thread[ForkJoinPool-1-worker-27,5,main], Thread[ForkJoinPool-1-worker-5,5,main], Thread[ForkJoinPool-1-worker-1,5,main], Thread[ForkJoinPool-1-worker-23,5,main], Thread[ForkJoinPool-1-worker-15,5,main], Thread[ForkJoinPool-1-worker-11,5,main], Thread[ForkJoinPool-1-worker-21,5,main], Thread[ForkJoinPool-1-worker-9,5,main], Thread[ForkJoinPool-1-worker-7,5,main], Thread[ForkJoinPool-1-worker-17,5,main], Thread[ForkJoinPool-1-worker-31,5,main], Thread[ForkJoinPool-1-worker-25,5,main]) 

其他,没有什么错的代码,它编译并正确执行。也许你应该检查你的编译器版本?

0

是的我知道这个工程在交互式scala,但不在编译期间scalac

好这里是简约的例子,让我们把这个文件“test.scala”:

//test.scala 
object test { 
    def main(args: Array[String]) = { 
    val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 
    println("thread = " + pthr) 
    } 
} 

现在,让我们在终端执行:

-> scalac test.scala            
test.scala:5: error: recursive value pthr needs type 
println("thread = " + pthr) 
        ^
one error found 

-> scalac -version        
Scala compiler version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL 

所以我又只能用scalac编译时有这个问题。

当我添加一个类型PTHR(val pthr: Set[String] = ...),那么一个错误是:

test.scala:4: error: type mismatch; 
found : Boolean 
required: Set[String] 
    val pthr:Set[String] = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet 
                       ^
one error found 

不知道是怎么回事:/

BTW。这是从“深度在斯卡拉”页205复制的确切代码。