【发布时间】:2013-04-17 00:32:04
【问题描述】:
目前,我正在尝试在 Scala 中解析 Reader[Token]。因此,我想在解析步骤中检查Token 是否是特定类的元素(例如AToken)。
我可以使用以下代码轻松做到这一点:
def aToken = acceptIf(_.isInstanceOf[AToken])("Token " + _ + " is not of type AToken")
^^ { _.asInstanceOf[AToken] }
这工作得很好。但我有几种类型要检查。所以对于每一种类型,我都需要在上面再写一遍。
所以我想要一些抽象的acceptIfInstanceOf[T] 方法,它会自动(神奇地?)为T 类型创建一个。
我目前的解决方案还是分两步:
def acceptIfInstanceOf[T](implicit m: Manifest[T]) : Parser[Elem] =
acceptIf(_.getClass == m.runtimeClass)("" + _ + " is not of type " + m)
def aToken = acceptIfInstanceOf[AToken] ^^ { _.asInstanceOf[AToken] }
这也可以,但我想摆脱aToken 中的函数应用程序,并将其直接包含在acceptIfInstanceOf 中。
可悲的是,这不起作用:
def acceptIfInstanceOf[T](implicit m: Manifest[T]) : Parser[T] =
acceptIf(_.getClass == m.runtimeClass)("" + _ + " is not of type " + m)
^^ { m.runtimeClass.cast(_) }
我从 Scala 编译器收到以下错误消息:
scala: type mismatch;
found : _$1 where type _$1
required: T
def acceptIfInstanceOf[T](implicit m: Manifest[T]): Parser[T] =
acceptIf(_.getClass == m.runtimeClass)("" + _ + " is not of type " + m)
^^ { m.runtimeClass.cast(_) }
^
有人知道是否以及如何构建这样的东西吗? 谢谢!
【问题讨论】:
-
您是否尝试将工作中的
acceptIfInstanceOf与_.asInstanceOf[T]组合在一起?就像那样acceptIf(_.getClass == m.runtimeClass)("" + _ + " is not of type " + m) ^^ {_.asInstanceOf[T] } -
我完全监督了这一点。是的,
_.asInstanceOf[T]有效。谢谢!但是,我必须调整我的代码,因为它不考虑子类型。例如。使用class BToken extends AToken,则acceptIfInstanceOf[AToken]不接受任何BTokens - 理想情况下应该这样做。
标签: scala generics casting parser-combinators