用宏隐藏封闭样板?

时间:2012-08-10 20:14:12

标签: scala scala-2.10 scala-macros

给出一个示例闭包,在这种情况下返回字符串中的单词数(带有一个额外的任意运算符)。

val myfunc = (s: String) => Option(s).map(_.split(" ").size).filter(_ >= 2)

有没有办法可以隐藏一些样板文件,以便我可以写:

val myfunc = given[String].map(_.split(" ").size).filter(_ >= 2)

2 个答案:

答案 0 :(得分:2)

如果您可以使用两个括号和一个下划线,那么您不需要宏:

class Given[A] {
  def apply[B](f: Option[A] => B): A => B = (a: A) => f(Option(a))
}
def given[A] = new Given[A]

行动中:

scala> val myfunc = given[String](_.map(_.split(" ").size).filter(_ >= 2))
myfunc: String => Option[Int] = <function1>

scala> List("salmon cod herring","tuna").map(myfunc)
res4: List[Option[Int]] = List(Some(3), None)

答案 1 :(得分:2)

我怀疑。宏用类型检查的东西替换它所处的函数调用。那么,在你的例子中你会用什么替换given[String]?如果您将其替换为(s: String) => Option(s),则可以获得此信息:

((s: String) => Option(s)).map(_.split(" ").size).filter(_ >= 2)

哪种效果不符合您的要求。你想要改变整行,这是不会发生的。