3

Scannersタイプを定義することを強制するクラスを作成していますToken

object MyScanner extends Scanners {
  type Token = ...
}

問題は、トークン クラス自体が呼び出されることTokenです。

abstract class Token(...)
case class Literal(...)
...

クラスの型Tokenを定義Scannersすることはどういうわけか Scala で可能ですか?Token

type Token = Token明らかに機能しません。

また、次のようにパッケージ名全体(で始まるmain.scala)を使用してみました:

type Token = main.scala....Token

mainの中で関数を定義したので、これは別の名前の衝突MyScannerです。

私の現在の解決策は、トークン クラスの名前を変更することです。最初の名前を保持できる別のものはありますか?

4

1 に答える 1

6

完全修飾クラス名を使用してトークン型を定義すると機能します。メイン メソッドとの名前の競合を避けるために、ルートプレフィックスを使用して、相対型名やメソッド名ではなく、完全修飾型名を参照していることを示すことができます。例えば:

package main

import scala.util.parsing.combinator.lexical._

case class Token(s: String)

object MyScanner extends Scanners {
  type Token = _root_.main.Token
  val Token = _root_.main.Token
  def errorToken(msg: String) = Token(msg)
  def token = ???
  def whitespace = ???

  def main = ???
}

他のいくつかの代替手段は次のとおりです。

  1. MyScanner オブジェクトの外部 (外側のオブジェクトまたはパッケージ オブジェクトのいずれか) で型エイリアスを定義します。
  2. トークン クラスをインポートし、インポートの一部としてエイリアスを設定します。例: import main.scala.{Token => MyToken}.
于 2013-03-16T19:21:08.863 に答える