斯卡拉的堆栈:()与{}

Mar*_*nkt 0 scope scala

我正在编写一些scala代码:

def getOpponentOf(request) 
   = if (getPlayerTupleOf(request)._1.id == request.id)
        getPlayerTupleOf(request)._1
     else getPlayerTupleOf(request)._2
Run Code Online (Sandbox Code Playgroud)

现在,我的命令主意是:"嘿,为什么我不会定义一个引用getPlayerTuple一次的局部变量然后使用该引用.

但是,我将不得不使用{}范围,而不是()(其是多个功能?)假设函数getPlayerTupleOf是完美的功能太即,使用免费()范围,副作用等.

例如,执行上述操作与此相比,性能/编译器含义是什么:

def getOpponentOf(request) = {
    val playerTuple = getPlayerTupleOf(request)

    if (playerTuple._1.id == request.id)
        playerTuple._1
     else playerTuple._2
}
Run Code Online (Sandbox Code Playgroud)

谢谢,马克

dzs*_*dzs 5

使用块{}不反对函数式编程.Scala"val"声明等同于其他函数语言中存在的"let"绑定(例如ML,F#),因此它们是完美的"功能"概念.不起作用的是使用定义为var而不是val变量.

关于性能:编译器通常不能确定您的方法是无副作用的,并且可以"缓存"具有相同参数的多个调用(例如,以本地"变量"的形式).因此,编译后的代码会在编写代码时有效地调用该方法.JIT仍然可以选择在运行时有效地优化它,它可能会也可能不会发生,具体取决于您的方法的实现方式和其他因素.

我认为还有其他方面需要考虑:简洁性,可维护性,第二个版本在这里获胜:没有代码重复,变量的名称可以帮助理解代码.