scala overriding无

sma*_*007 2 scala

我的第一个Scala计划,我被困住了.

所以基本上我试图在过去的声明中将"last"的潜在None值覆盖为0l.

import java.util.Date;

object TimeUtil {
    var timerM = Map( "" -> new Date().getTime() );

    def timeit(seq:String, comment:String) {
        val last = timerM.get(seq) 
        val cur = new Date().getTime()
        timerM += seq -> cur;
        println( timerM )
        if( last == None ) return;

        val past = ( last == None ) ? 0l : last  ;
        Console.println("Time:" + seq + comment + ":" + (cur - past)/1000  )
    }

    def main(args : Array[String]) {
        timeit("setup ", "mmm")
        timeit("setup ", "done")
    }
}
Run Code Online (Sandbox Code Playgroud)

oxb*_*kes 7

您应该尝试更多地解决问题,但肯定包括您的实际错误!

但是,Scala中没有三元运算符(? :),因此您可以使用:

if (pred) a else b //instead of pred ? a : b
Run Code Online (Sandbox Code Playgroud)

这是因为(差不多 - 请参阅下面的Kevin的评论)scala中的所有内容都是带有返回类型的表达式.在Java中并非如此,其中某些内容是语句(没有类型).使用scala,使用合成更好,而不是分叉(即if (expr) return;在你的例子中).所以我会把它重写为:

val last = timerM.get(seq)
val cur = System.currentTimeMillis
timerM += (seq -> cur)
println(timerM)
last.foreach{l => println("Time: " + seq + comment + ":" + (l - past)/1000 ) }  
Run Code Online (Sandbox Code Playgroud)

请注意,您的示例中的三元操作无论如何都是无关紧要的,因为此时last不能为None(如果是,则刚刚返回).我的建议是在短时间内使用显式类型,因为你习惯了Scala.那么上面就是:

val last: Option[Long] = timerM.get(seq)
val cur: Long = System.currentTimeMillis
timerM += (seq -> cur)
println(timerM)
last.foreach{l : Long => println("Time: " + seq + comment + ":" + (l - past)/1000 ) }  
Run Code Online (Sandbox Code Playgroud)

(在您的评论中似乎您可能正在尝试为其分配Longlast,当然这将是一个错误,因为last它是类型Option[Long],而不是Long)

  • 我也犯了这个错误.并非Scala中的所有内容都是表达式,变量,类和方法定义都是语句,导入语句和(我认为)赋值也是如此.当编译器遇到一个以语句终止的代码块时,如果你试图评估那个块,它会在末尾插入表达式`()` - 从而给出*appearance*表示一切都是表达式. (2认同)