1

複数のステップを持つテストを実行するために、scala を使用して STAF をラップしています。

基本的に、各ステップはブール値を返すメソッド呼び出しです。ステップは順番に実行されます。前のステップが true を返す場合にのみ、Scala に次のステップに進むように指示する方法があるかどうか疑問に思っています。

ありがとう、

編集

以下に例を追加しました。

これは、テスト後にデータを収集するための手順のリストです。3つのステップがあります。1) ログを圧縮し、2) 圧縮されたアーカイブをどこかにコピーし、3) ログ ディレクトリをクリアします。

zipDir(handle, "testmachine1", """C:\Logs""", """C:\Logs.zip""")
copyFile(handle, "testmachine1", """C:\Logs.zip""", "RepoMachine", """c:\data""")
clearDirContent(handle, "testmachine1", """C:\Logs""")

私にとっては、前の手順が正しく実行されている場合にのみ、続行する意味があります. たとえば、そもそも zip ファイルの作成中にエラーが発生した場合、ステップ 2 で zip ファイルをコピーしても意味がありません。

私の要点を説明するために、私が望むことを達成するための詳細な方法を次に示します。

var result = zipDir(handle, "testmachine1", """C:\Logs""", """C:\Logs.zip""")
if (result) 
    result = copyFile(handle, "testmachine1", """C:\Logs.zip""", "RepoMachine", """c:\data""")
if (result) 
    result = clearDirContent(handle, "testmachine1", """C:\Logs""")
4

4 に答える 4

4

私はスカラを知りませんが、プレーンなJavaを使用すると、それらをANDで結合できます。func が false を返すとすぐに、式は false になり、実行が停止します。

val result = fun1() && func2() && func3()
于 2013-03-18T21:35:01.627 に答える
3

さて、あなたの場合、単純なブール値を使用できます:

val result = zipDir(handle, "testmachine1", """C:\Logs""", """C:\Logs.zip""")
          && copyFile(handle, "testmachine1", """C:\Logs.zip""", "RepoMachine", """c:\data""")
          && clearDirContent(handle, "testmachine1", """C:\Logs""")

&&とは異なり&、最初の false 値で停止します

時代遅れの答え:

どうlistOfMethods.forall(f => f(x))ですか?短絡するため、最初の false の後の操作は実行されません。

scala> def a() = { println("A"); false } 
a: ()Boolean

scala> def b() = { println("B"); true }
b: ()Boolean                                          

scala> List(a _ ,b _ ).forall(f => f())
A
res2: Boolean = false

重要な注意:クロージャをコレクションに配置する必要があります: マジックを記述した場合List(a(1), b(2))、a(1) と b(2) はリストに配置される前に積極的に実行されます。次のように書くことができます:

def foo(x: Int) = { println ("Foo is " + x); false}
def bar(x: Int) = { println ("Bar is " + x); false}
List(
  () => foo(1), 
  () => bar(2)
).forall{ fun => fun() } 
于 2013-03-18T21:19:12.157 に答える
2

私はあなたが望んでいると思います-scalazの検証またはEitherの何らかの形を返すことで理解するので、それは

for {
  res1 <- func1
  res2 <- func2
  ...
} yield resN

このように、関数が失敗を返すと、失敗した場所で停止します。

于 2013-03-18T21:32:11.183 に答える
1

これを行う慣用的な Scala の方法は、for-comprehensionを使用することです。中間メソッドは、.map と .flatMap が定義された型を返す必要があります。ここでは、操作が成功した場合は Some であり、それ以外の場合は None である Option を返すことができます。エラーメッセージを保存したい場合は、検証またはどちらかを調べてください。

var result = for {
  zipped <- zipDir(handle, "testmachine1", """C:\Logs""", """C:\Logs.zip""")
  copied <- copyFile(handle, "testmachine1", """C:\Logs.zip""", "RepoMachine", """c:\data""")
  cleared <- clearDirContent(handle, "testmachine1", """C:\Logs""")
} yield {
   cleared
}

result3 つの操作がすべて行われた場合は Some になり、それ以外の場合は None になります。中間ステップのいずれかが返されない場合、操作は短絡します。内部では、for-comprehension はmap と flat-map を使用します。

短絡 AND よりもこれを提案する理由は、はるかに柔軟だからです。たとえば、ファイル名とパスをハードコーディングする必要がなくなった場合は、zip 操作が成功した場合に zipDir が zip されたファイルへのフル パスを返すようにします。コードは次のようになります

val result = for {
  zipped  <- zipDir(handle, machine, filepath)
  copied  <- copyFile(handle, machine, zipped, newlocation)
  cleared <- clearDirContent(handle, machine, filepath)
} yield cleared
于 2013-03-18T21:41:37.380 に答える