我对Scala很新,但我认为该语言的优势之一就是删除了例如Java中存在的括号和圆点等仪式。所以当我发现我可以写例如
时,我感到非常困惑str1 equals str2
但不是
println "Hello world"
我猜测它与第一个例子有三个“部分”有关,但第二个例子只有两个,但我很难理解为什么会这样。
答案 0 :(得分:52)
当只有两个部分时,表达式被视为方法调用。即
的唯一可能性println "Hello, world"
将是
println."Hello, world"
这当然没有多大意义。 (*****见下文补充说明)
但是,如果您愿意,可以编写Console println "Hello, World"
来解决歧义。
在字符串示例中看起来没有ambigus,字符串很难成为方法名称,但请注意以下几点:
class B
val b = new B
object A {
def apply(myB: B) { print("apply") }
def b { print("b") }
}
现在,在撰写A b
时,我会得到什么。应该如何解释?事实证明:
A b // "b"
A.b // "b"
A(b) // apply
因此,有一个明确的规则,在两部分表达式中做什么。 (我希望没有人开始讨论关于apply
和实际方法调用的问题......)
<强>加成强>
随着动态类的出现,你可以玩一下并定义以下内容
object println extends Dynamic {
def typed[T] = asInstanceOf[T]
def applyDynamic(name: String)(args: Any*) = Console.println(name)
}
现在看!没有括号:
println `Hello, world` // prints, "Hello, world"
当然,请不要在孩子面前或现实代码中这样做。
答案 1 :(得分:5)
您可以使用三个“部分”重写第二个示例,在这种情况下,它将在没有括号的情况下进行编译:
Predef println "Hello world"
(仅用于说明目的 - @ Debilski的答案是完美的!)