Scala中“返回”的良好替代方案

时间:2016-09-30 21:38:04

标签: scala return

例如:

public void Configure(
            IApplicationBuilder app,
            IHostingEnvironment env,
            ILoggerFactory loggerFactory,
            ShortenerContext db)
{
    db.Database.Migrate();
    //Rest omitted
}

显然scala中没有def validate(input) = { if (conditionA(input)) { return A } if (conditionB(input)) { return B } if (conditionC(input)) { return C } continueProcess(input) } ,那么上面有什么替代方案呢?

3 个答案:

答案 0 :(得分:2)

为了避免多个退出点,总是存在一个你愿意容忍多少缩进的问题。

def validate(input) = {
  if      (conditionA(input)) A
  else if (conditionB(input)) B
  else if (conditionC(input)) C
  else {
    continueProcess(input)
  }
}

作为一般规则,因为FP鼓励“纯粹”功能(没有副作用,并且对于给定的输入总是相同的输出),所以需要单个出口点。

答案 1 :(得分:1)

使用匹配

def validate(input) = (conditionA(input), conditionB(input), conditionC(input)) match {
  case (true, _, _) => A
  case (false, true, _) => B
  case (false, false, true) => C
  case (false, false, false) => continueProcess(input)
}

答案 2 :(得分:0)

return在Scala中可用,但它不是惯用的。而是使用以下替代方案之一:

  1. 只需使用匹配:

    def validate(input) = {
      val result = input match {
        case x if conditionA(x) => A
        case x if conditionB(x) => B
        case x if conditionC(x) => C
      }
      continueProcess(input)
      result
    }
    
  2. 此外,Scala尝试将所有内容都设为表达式,因此if也是一个表达式。你也可以写:

    def validate(input) = {
      val result = if (conditionA(x)) 
        A
      else if (conditionB(x))
        B
      else if (conditionC(x))
        C
      else
        ???
    
      continueProcess(input)
      result
    }