我的第一个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)
您应该尝试更多地解决问题,但肯定包括您的实际错误!
但是,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)
(在您的评论中似乎您可能正在尝试为其分配Long值last,当然这将是一个错误,因为last它是类型Option[Long],而不是Long)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |