为什么我不能在Scala中写println“Hello world”?

时间:2010-09-01 11:26:32

标签: scala

我对Scala很新,但我认为该语言的优势之一就是删除了例如Java中存在的括号和圆点等仪式。所以当我发现我可以写例如

时,我感到非常困惑
str1 equals str2

但不是

println "Hello world"

我猜测它与第一个例子有三个“部分”有关,但第二个例子只有两个,但我很难理解为什么会这样。

2 个答案:

答案 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的答案是完美的!)