2014-09-23 78 views
0

我读了这个问题:LinkScala - 什么是类型输入,Input.Source和Input.Offset是什么意思?

这是一个代码块,其接受的答案:

/** A parser that matches a regex string */ 
    implicit def regex(r: Regex): Parser[String] = new Parser[String] { 
    def apply(in: Input) = { 
     val source = in.source 
     val offset = in.offset 
     val start = handleWhiteSpace(source, offset) 
     (r findPrefixMatchOf (source.subSequence(start, source.length))) match { 
     case Some(matched) => 
      Success(source.subSequence(start, start + matched.end).toString, 
        in.drop(start + matched.end - offset)) 
     case None => 
      Failure("string matching regex `"+r+"' expected but `"+in.first+"' found", in.drop(start - offset)) 
     } 
    } 
    } 

我不明白的代码的某些部分:花括号之间

  • 代码就像是它定义了一个新类,虽然之前它是“新的Parser [String]”,我知道的是创建类Parser的新时刻[String]
  • 在代码中,有一个fu应用类型输入的参数,但我没有发现任何类似Scaladoc及其成员:源,偏移

你能解释这些部分给我吗?

回答

0

Input是来自scala-parser-combinators库的Parsers中的类别别名。

在写回答时,解析器组合器仍在scala standard library中。从Scala 2.11开始它们被删除。

的文档为Parsers(也为RegexParsers,我猜是更具体什么正在这里使用)说:type Input = Reader[Elem],所以Reader是具有sourceoffset字段类型。

new Parser { ... }定义了一个匿名类,它扩展了Parser[String]

+0

对不起。在这种情况下什么是别名,因为我确定正则表达式没有成员源和偏移?那么第一部分呢,我们怎样才能在“新”之后定义花括号和应用方法呢?关于该版本,我仍然使用2.9.2所以它不应该是一个问题。 – Tr1et 2014-09-23 07:47:22

+0

它在文档中说:type Input = Reader [Elem]。阅读器有源和偏移量字段。 – 2014-09-23 08:29:10

+0

带花括号的'new'定义了一个扩展Parser [String]的匿名类。 – 2014-09-23 08:34:38