我正在学习scala,我看到很多例子在类中使用了print
和println
。我注意到Console println "Hello"
会打印,但println "Hello"
不会打印expected but string literal found.
,但是println("Hello")
会有效。
据我所知,一切都是Scala中对象/类的函数,在我的第一个例子中,我在println
对象上调用Console
,但在第二个场景中我需要括号,为什么?
答案 0 :(得分:7)
println("Hello")
表示Predef.println("Hello")
。
默认情况下会导入Predef
的所有成员。
在scala中,您可以导入对象的成员。
您可以像这样调用方法println
:Predef println "Hello"
。对于具有单个参数的方法,您可以删除点和括号。它被称为operator notation
。但在这种情况下,您必须指定目标对象(Predef
)和参数。
另见:
The Scala Language Specification 9.1编译单元:
按顺序隐式导入每个编译单元: 包
java.lang
,包scala
和对象scala.Predef
Programming in Scala, First Edition. 4.4 A Scala application:
Scala隐式导入包
java.lang
和scala
的成员 以及名为Predef
的单个对象的成员,以及每个对象 Scala源文件。Predef
位于scala
包中,包含 许多有用的方法。例如,当您在Scala中说println
时 源文件,您实际上是在println
上调用Predef
。 (Predef.println
转过身来调用Console.println
真正的工作。)当你说assert
时,你正在调用Predef.assert
。
Programming in Scala, First Edition. 5.3 Operators are methods:
任何方法都可以是运算符
在Scala中,运算符不是特殊的语言语法:任何方法都可以 一个运营商。使方法成为操作符的方法就是如何使用它。什么时候 你写“
s.indexOf('o')
”,indexOf
不是运营商。但是当你 写“s indexOf 'o'
”,indexOf
是一个运算符,因为你正在使用它 用运算符表示法。