2013-03-20 95 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進行相應的轉換爲此類型,您可以實現更多有用的效果。