1

我正在使用 scala 来包裹 STAF 以运行具有多个步骤的测试。

基本上每个步骤都是一个返回布尔值的方法调用。这些步骤按顺序执行。我想知道是否有一种方法可以告诉 Scala 只有在前一个返回 true 时才进入下一步?

谢谢,

编辑

在下面添加了一个示例。

这是我在测试后收集数据的步骤列表。它有 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

我不知道任何 scala,但使用纯 java 你只需将它们放在一起。一旦 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""")

&&不像&在第一个错误值上停止

过时的答案:

怎么样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 的类型——在这里,如果操作成功,您可以返回一个 Option ,否则返回 None 。如果要保留错误消息,请查看 Validation 或 Either。

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
}

result如果所有 3 次操作都发生,则为 Some ,否则为 None 。如果任何中间步骤不返回,则操作短路;在引擎盖下,理解使用map 和 flat-map

我之所以建议在短路 AND 上这样做是因为它更加灵活。例如,您可能不想再对文件名和路径进行硬编码,因此如果 zip 操作成功,您可以让 zipDir 返回压缩文件的完整路径。您的代码可能看起来像

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 回答