2010-03-09 14 views
13

基本上,我希望能够建立一个自定义提取器,而不必在使用它之前将它存储在变量中。可以使用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

+0

你呢,呃,*试试*它? – 2010-03-09 19:04:24

+0

我曾尝试它,我收到一个语法错误: 阶> VAL {someExtractorBuilder(真)}(结果)= “测试” :1:错误:简单图案 val的非法启动{someExtractorBuilder(真)} (result)=“test” ^ – 2010-03-09 19:43:53

+0

你最终想做什么?可能有更好的方法来做它比制造大量的提取器。 – 2010-03-10 05:24:50

回答

2

都能跟得上。

8.1.7提取模式

An extractor pattern x (p 1 , . . . , p n) where n ≥ 0 is of the same syntactic form as a constructor pattern. However, instead of a case class, the stable identifier x denotes an object which has a member method named unapply or unapplySeq that matches the pattern.

7

参数化的提取会很酷,但我们没有足够的资源,现在要实现它们。

+1

感谢您关注这些问题:-) – Lutz 2011-07-08 09:34:41

1

人们可以自主使用隐式参数提取器在一定程度上,这样的:

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语句在相同的范围内。尽管如此,它有时也很有用。

相关问题