在一个特征中,我无法使用从另一个特征中的方法返回的解析器。编译器抱怨类型不匹配,在我看来问题是由于路径相关类造成的。我不知道如何得到我想要的。
trait Outerparser extends RegexParsers {
def inner: Innerparser
def quoted[T](something: Parser[T]) = "\"" ~> something <~ "\""
def quotedNumber = quoted(inner.number) // Compile error
def quotedLocalNumber = quoted(number) // Compiles just fine
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
trait Innerparser extends RegexParsers {
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
和错误:
[error] /Path/to/MyParser.scala:6: type mismatch
[error] found : minerals.Innerparser#Parser[Int]
[error] required: Outerparser.this.Parser[?]
[error] def quotedNumber = quoted(inner.number)
我有点明白了:每个“某事”方法都定义了一个 Parser 类型,其路径特定于封闭类(Outerparser 或 Innerparser)。Outerparser 的“引用”方法需要一个 Outerparser.this.Parser 类型的实例,但正在获取 Innerparser#Parser。
我喜欢能够使用从此类或其他类获得的解析器引用。我怎样才能做到这一点?