2016-06-28 4 views
2

として解析コロン2つのアンダースコア:スカラ:私は最近プレイのJSONライブラリで遊んで、これはコンパイルできないことに気づいた1トークン

val steps = Seq("a", "b", "c") 
steps.foldLeft(__)((a, x) => a \ x) 

少し工夫した後、ソースを閲覧し、I第二が...

steps.foldLeft(__())((a, x) => a \ x) 

steps.foldLeft(JsPath())((a, x) => a \ x) 

かさえ:正しい表現を見つけました1つはかなり難読化されています。

は、後になって、私は、より効率的かつ簡潔な表現が見つかりました:

JsPath(steps.toList map KeyPathNode) 

をしかし、私は、元の式に戻って、それで遊んで続けました。私は、これが機能することを発見:

steps.foldLeft(JsPath: JsPath)((a, x) => a \ x) 

はどういうわけか、これはそうではない:

steps.foldLeft(__: JsPath)((a, x) => a \ x) 

は私がerror: not found: value __を取得します。しかし、これは動作します:

steps.foldLeft((__): JsPath)((a, x) => a \ x) 

これはあまりにも動作します:

steps.foldLeft({__}: JsPath)((a, x) => a \ x) 

また、この:

steps.foldLeft(__.asInstanceOf[JsPath])((a, x) => a \ x) 

なぜそれが__: JsPathとの表現が失敗したということでしょうか?パーサが1つのトークンとして__:を解釈しているようだ

steps.foldLeft(__ : JsPath)((a, x) => a \ x) 

:私はこの質問を提出することを約あった直前

は... Aaaaaand私は別のワーキング表現を見つけました。しかし、それはなぜでしょうか?私はアンダースコアはもう一つの有効な識別子文字だと思った。特別なケースの解析ルールがありますか?

答えて

3

アンダースコアは、:を含むオペレータ文字の後に続けることができるため、識別子では特殊です。 foo_+は識別子であり、foo+は2つのトークン:foo+です。

First, an identifier can start with a letter which can be followed by an arbitrary sequence of letters and digits. This may be followed by underscore _ characters and another string composed of either letters and digits or of operator characters.

_$が、ここで最初の文の目的のための大文字とみなされることに注意してください。したがって__:は法的な識別子ですが、_:はありません。

+1

コメントでアップアップすることはできませんが、クリック可能なクォートは非常に便利です。情報を追加するだけです:アンダースコアはパターンvarid: '42 match {case __:=> __:}'の小文字です。今、ユースケースが必要です。私はかつて大文字の矢印を整列させるための拡張されたアンダースコアを試しましたが、おそらく多分私は試してみます。42 match {case __ ========> =>()} ' –

+0

それは好奇心です。私はhttps://groups.googleでこれについて尋ねました。com/forum /#!topic/scala-user/sh20Vr2BK9Y。 –

関連する問題