2013-03-20 65 views
2

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

从本质上讲,我想创建一个控制结构,看起来有点像 for循环,我可以创建一个变量,我,并在仅循环体访问I:

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

我会喜欢在我的代码中做类似的事情。例如,

​​

现在,我避开这个问题,宣布自定义控制结构,这看起来不是很优雅的外部变量。

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

val myVar2 = "Task2"  
customControl { 
    computation(myVar2) 
} 
+0

应该可以编写一个宏来使用无类型的宏来完成此操作。我现在没有时间写它,但基本思想是有一个带有两个参数列表的宏,它将重写成一个块,将绑定放置在第二个块的开始处。我开始做一个简单的叫做[scala-where](https://github.com/nc6/scala-where)的东西,这可能会让你知道从哪里开始。 – Impredicative 2013-03-20 11:40:59

回答

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> 
2

注意,对于

expr foreach (x => body) 

内置for (x <- expr) body只是语法糖因此有可能实现你想要什么定义一个定制foreach方法(使用现有for语法)。

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

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

:您还可以更改上述fUnitAny结果类型,它仍然可以工作。

这将使你做这样的事情

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

这仅仅是一个微不足道的(无用)例如,由于现在for (x <- T(y)) f(x)只是简写为(或者说“enlongishes”)f(y)。当然,通过将上述foreach定义中的f的参数从String更改为其他内容并从字符串t进行相应的转换为此类型,您可以实现更多有用的效果。