似乎 Scala 2.10 附带的字符串插值可以在这里为您提供帮助。首先,您可以实现简单的$
方法,即立即执行命令。为了做到这一点,您需要在以下位置添加此自定义方法StringContext
:
object ShellSupport {
implicit class ShellStrings(sc: StringContext) {
def $(args: Any*) =
sc.s(args: _*) split "\n" map (_.trim) filterNot (_.isEmpty) foreach { cmd =>
// your excution logic goes here
println(s"Executing: $cmd")
}
}
}
现在你可以像这样使用它:
import ShellSupport._
val testDir = "/tmp/test"
$"mkdir $testDir"
$"cd $testDir"
$"""
wget some-url
wget another-url
"""
您可以利用它的语法(它唯一的缺点是不能在$
and之间添加空格"
)和命令中的字符串插值。
现在让我们尝试实现你的魔法特质。这通常是相同的想法,但我也使用DelayedInit
它来正确定义命令,然后在类创建期间自动执行它们。
trait MyMagicTrait extends DelayedInit {
private var cmds: List[String] = Nil
def commands = cmds
implicit class ShellStrings(sc: StringContext) {
def $(args: Any*) = {
val newCmds = sc.s(args: _*) split "\n" map (_.trim) filterNot (_.isEmpty)
cmds = cmds ++ newCmds
}
}
def delayedInit(x: => Unit) {
// your excution logic goes here
x
cmds map ("Excutintg: " + _) foreach println
}
}
它的用法:
class MyCoolScript extends MyMagicTrait {
val downloader = "wget"
$"mkdir /tmp/test"
$"cd /tmp/test"
$"""
$downloader some-url
$downloader another-url
"""
}
new MyCoolScript
这两种解决方案都产生相同的输出:
Executing: mkdir /tmp/test
Executing: cd /tmp/test
Executing: wget some-url
Executing: wget another-url