可以使用case语句的主体(或者使用提取器的任何其他地方)中的参数来定制提取器吗?

基本上,我希望能够构建自定义提取器,而无需在使用它之前将其存储在变量中。 这不是我将如何使用它的真实示例,它更可能用于正则表达式或其他字符串模式(如构造),但希望它能解释我正在寻找的内容:
def someExtractorBuilder(arg:Boolean) = new {
  def unapply(s:String):Option[String] = if(arg) Some(s) else None
}

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test"
"test" match {case {someExtractorBuilder(true)}(result) => result }

//instead I would have to do this:
val customExtractor = someExtractorBuilder(true)
val customExtractor(result) = "test"
"test" match {case customExtractor(result) => result}
当只做一个自定义提取器时,它没有太大区别,但是如果你为case语句构建一个大的提取器列表,那么通过将所有提取器与它们的用法分开,可能会使事情变得更难。 我希望答案是不,你不能这样做,但我想我先问一下:D     
已邀请:
不。 8.1.7提取器模式   提取器模式x(p 1,...,   p n)其中n≥0是相同的   句法形式作为构造函数   图案。但是,而不是一个案例   类,稳定标识符x表示   具有成员方法的对象   命名为unapply或unapplySeq   匹配模式。     
参数化提取器很酷,但我们现在没有资源来实现它们。     
迟到但我的lib中有一个scalac插件提供语法
~(extractorWith(param), bindings)
x match {
  case ~(parametrizedExtractor(param)) => 
    "no binding"
  case ~(parametrizedExtractor(param), (a, b)) =>
    s"extracted bindings: $a, $b"
}
https://github.com/cchantep/acolyte/blob/master/scalac-plugin/readme.md     
可以使用隐式参数在一定程度上自定义提取器,如下所示:
object SomeExtractorBuilder {
  def unapply(s: String)(implicit arg: Boolean): Option[String] = if (arg) Some(s) else None
}

implicit val arg: Boolean = true
"x" match {
  case SomeExtractorBuilder(result) =>
    result
}
不幸的是,当你想在一个
match
中使用不同的变体时,不能使用它,因为所有
case
语句都在同一范围内。不过,它有时也很有用。     

要回复问题请先登录注册