Scala是否有全局对象或类?

时间:2014-01-10 23:38:35

标签: scala

我知道程序员应该将他们的代码包装在一个应用程序对象中:

object Hello extends App {
  println("Hello, World")
}

如果我想获得任何输出,那么在Eclipse中是必需的。但是,当我尝试在Emacs中编写一些代码(非常随便)时,我这样写:

class Pair[+T](val first: T, val second: T)

trait Friend[-T] {
  def befriend(someone: T)
}

def makeFriendWith(s: Student, f: Friend[Student]) {
  f.befriend(s)
}

似乎没有包含函数makeFriendWith的通用对象或类。 Scala是否像JavaScript一样,一切都附加到全局对象?如果没有,这个功能附加什么?

另外为什么这可以在控制台中工作(我使用scala命令并且它有效)但在Eclipse中不起作用? Application对象有什么用?

4 个答案:

答案 0 :(得分:5)

Scala没有顶级defs,但您的脚本可以由REPL或scala脚本运行器运行。

脚本的准确行为取决于您运行它的方式。

REPL可以逐行或全程运行脚本。 (比较:paste:paste -raw:load-i init.script以及将来的选项-I init.script。)

有一个issue about sensitive scripting。脚本运行器应该意识到您是否尝试运行App

another effort脚本编写阶段,可以轻松定制。滚动到Scripter.scala以获取有关其当前启发式的代码注释。

简而言之,您的defs必须包含在顶级实体中,但具体如何发生是依赖于上下文的。

a recent effort为REPL提供替代的烘焙包装方案。

这些都不是语言规范的强制要求,只不过与sbt构建文件有关的特殊规则由语言定义。

答案 1 :(得分:2)

您可以在控制台中定义类似 的方法,这些方法(在幕后)会自动将它们包装在匿名类中。

在控制台之外,没有这样的奢侈品。

答案 2 :(得分:1)

作为一种JVM语言,Scala无法真正创建除类和接口之外的任何顶级实体。

然而,它确实具有“包装对象”的概念,这种概念会产生价值诱惑的假象(valvardef),而不包含在类或特征中

有关包对象的信息,请参阅http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html

答案 3 :(得分:0)

可以直接在Eclipse中运行这样的代码:使用Scala worksheet。 IntelliJ IDEA Scala插件也支持它。