为什么我无法在Scala中打印调试消息?

时间:2016-03-06 12:25:01

标签: scala

我试图按照 Scala编程一书中的第6.2章构建理论。 但是在尝试这样做时我遇到了问题。

这是 test.scala

class Rational(n: Int, d: Int) 
{   println("Created "+n+"/"+d)
 }

所以我先在终端窗口输入以下内容。

user$ scala
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_73).
Type in expressions to have them evaluated.
Type :help for more information.

然后使用:load test.scala

scala> :load test.scala
Loading test.scala...
defined class Rational
<console>:12: error: not found: value n
        println("Created "+n+"/"+d)
                           ^
<console>:12: error: not found: value d
        println("Created "+n+"/"+d)
                                 ^

当我输入new Rational(1, 2)时,我期待着。

Created 1/2
res0: Rational = Rational@90110a

但结果是

res0: Rational = Rational@9e89d68

解释器只返回第二行。如何打印出此调试消息?

BTW,我正在使用Mac OS。

任何帮助将不胜感激。提前谢谢。

更新

这是正确的做法。

class Rational(n: Int, d: Int){
println("Created "+n+"/"+d)
 }

2 个答案:

答案 0 :(得分:7)

分号推断正在破坏你的一天。

Scala编译器解释

class Rational(n: Int, d: Int) 
{   println("Created "+n+"/"+d)
 }

作为

class Rational(n: Int, d: Int); 
{   println("Created "+n+"/"+d);
 }

糟糕!

请改为尝试:

class Rational(n: Int, d: Int) {
   println("Created "+n+"/"+d)
}

编译器不再在第一行的末尾推断出分号,因为打开的大括号表示还有更多的分号。

它应该工作得更好。

答案 1 :(得分:3)

错误的原因是test.scala文件中的代码实际上被评估为两个单独的语句。 之所以如此,是因为在这种情况下,行分隔符被视为分号。

分号推理规则: http://jittakal.blogspot.com/2012/07/scala-rules-of-semicolon-inference.html

如果您将其更改为(一行):

class Rational(n: Int, d: Int) { println("Created "+n+"/"+d) }

或更好:

class Rational(n: Int, d: Int) { 
    println("Created "+n+"/"+d) 
}

那么它会表现得像你期望的那样。