我知道程序员应该将他们的代码包装在一个应用程序对象中:
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对象有什么用?
答案 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无法真正创建除类和接口之外的任何顶级实体。
然而,它确实具有“包装对象”的概念,这种概念会产生价值诱惑的假象(val
,var
和def
),而不包含在类或特征中
有关包对象的信息,请参阅http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html。
答案 3 :(得分:0)
你可以直接在Eclipse中运行这样的代码:使用Scala worksheet。 IntelliJ IDEA Scala插件也支持它。