2

我想知道是否有办法在自定义控制结构的参数列表中创建临时变量。

本质上,我想创建一个类似于 for 循环的控制结构,我可以在其中创建一个变量 i,并且只能在循环体中访问 i:

for(i<- 1 to 100) {
   //loop body can access i here
}
//i is not visible outside

我想在我的代码中做类似的事情。例如,

customControl ( myVar <- "Task1") {
    computation(myVar)
}

customControl ( myVar <- "Task2") {
    computation(myVar)
}
def customControl (taskId:String) (  body: => Any) = {
    Futures.future {
        val result = body

        result match {
            case Some(x) =>
                logger.info("Executed successfully")
                x
            case _ =>
                logger.error(taskId + " failed")
                None
        }

    }
}

现在,我通过在自定义控制结构之外声明一个变量来解决这个问题,这看起来不太优雅。

val myVar = "Task1"
customControl {
    computation(myVar)
}

val myVar2 = "Task2"    
customControl {
    computation(myVar2 )
}
4

2 回答 2

2

请注意,内置for (x <- expr) body只是语法糖

expr foreach (x => body)

因此,可以通过定义自定义方法来实现您想要的(使用现有for语法) 。foreach

另请注意,已经有foreach一种适用于字符串的方法。你可以这样做:

case class T(t: String) {
  def foreach(f: String => Unit): Unit = f(t)
}

注意:您也可以将f上面的结果类型从更改UnitAny,它仍然可以工作。

这将使您能够做类似的事情

for (x <- T("test"))
  print(x)

这只是一个微不足道的(无用的)示例,因为现在for (x <- T(y)) f(x)只是缩写(或者更确切地说是“延长”)f(y)。当然,通过将上述fromf定义中的参数更改为其他内容,并从字符串到此类型进行相应的翻译,您可以获得更多有用的效果。foreachStringt

于 2013-03-20T04:06:19.847 回答
2

你可以这样做:

import scala.actors.Futures

def custom(t: String)(f: String => Any) = {
  Futures.future {
    val result = f(t)

    result match {
      case Some(x) =>
        println("Executed successfully")
        x
      case _ =>
        println(t + " failed")
        None
    }

  }
}

然后你可以得到这样的语法,这不完全是你所要求的,但可以避免你在单独的行上声明变量:

scala> custom("ss") { myvar => println("in custom " + myvar); myvar + "x" }
res7: scala.actors.Future[Any] = <function0>
in custom ss
ss failed

scala> custom("ss") { myvar => println("in custom " + myvar); Some(myvar + "x") }
in custom ss
Executed successfully
res8: scala.actors.Future[Any] = <function0>

scala> 
于 2013-03-20T04:16:00.357 回答