2

カスタム制御構造のパラメーター リストに一時変数を作成する方法があるかどうか疑問に思っています。

基本的に、変数 i を作成し、ループ本体でのみ i にアクセスできる for ループのような制御構造を作成したいと考えています。

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:上記の結果タイプをからに変更することもできますが、UnitそれでもAny機能します。

それはあなたが次のようなことをすることを可能にするでしょう

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

これは些細な(そして役に立たない)例です。これは、現在はfor (x <- T(y)) f(x)単に省略(または「長く」)しているためf(y)です。しかしもちろんf、上記の定義のの引数をforeachfromStringから別の何かに変更し、対応する文字列tからこのタイプへの変換を行うことで、より有用な効果を得ることができます。

于 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 に答える