我是一名正在研究
Scala的Haskeller.我遇到的不是代码,而是导入/包.
我有两个文件,Test.scala和Lists.scala.
// Lists.scala package problems object Lists { def last(list: List[Any]): Option[Any] = list match { case Nil => None case x :: Nil => Some(x) case _ :: xs => last(xs) } }
和:
// Test.scala import problems._ object Test extends App { println("Starting tests...") println(last(List(1,2,3,4,5))) }
Test.scala不编译.运行scalac Test.scala Lists.scala产生:
Test.scala:5: error: not found: value last println(last(List(1,5))
然而,重写为Lists.last使其成功.这不是打败导入问题的重点._通配符?我注意到数学函数可以在没有前面的数学的情况下编写.通过导入math._.为什么这对我的文件也不起作用?
真正的目标:我只想创建一个包,然后在另一个文件中使用println轻松测试其功能.最好的方法是什么?我是否可以取消Test.scala中的对象{…}并使用scala运行它,放弃编译过程?
解决方法
Doesn’t that defeat the point of the import problems._ wildcard?
不,不是的.通过使用通配符,您将该包中的所有类/对象放入范围,而不是其内容.
I notice that math functions can be written without a preceding
math.
by doingimport math._
Why won’t this work for my files as well?
它会工作,但你需要一个适当的导入:import problems.Lists._.否则,您可以将功能放入package object.