给出一个示例闭包,它在这种情况下返回字符串中的单词数(使用附加的任意运算符)。用宏隐藏封闭样板?
val myfunc = (s: String) => Option(s).map(_.split(" ").size).filter(_ >= 2)
有没有一种方法,我可以隐藏一些样板的,这样我可以写:
val myfunc = given[String].map(_.split(" ").size).filter(_ >= 2)
给出一个示例闭包,它在这种情况下返回字符串中的单词数(使用附加的任意运算符)。用宏隐藏封闭样板?
val myfunc = (s: String) => Option(s).map(_.split(" ").size).filter(_ >= 2)
有没有一种方法,我可以隐藏一些样板的,这样我可以写:
val myfunc = given[String].map(_.split(" ").size).filter(_ >= 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)
我怀疑。一个宏会将它所在的函数调用替换为输入检查的内容。那么,在你的例子中,你会取代given[String]
?如果您有(s: String) => Option(s)
取代它,你会得到这样的:
((s: String) => Option(s)).map(_.split(" ").size).filter(_ >= 2)
这并不像你想的工作。你希望整条线被改变,这是不会发生的。
我不得不赞同丹尼尔。如果看起来可能用宏,我会感到惊讶。 – 2012-08-10 23:08:38
这真的很棒,绝对有帮助!我想知道2.10中的宏是否能够把我整个9码? – AndrewF 2012-08-10 20:30:47