4

私は Scala を学んでおり、適切な関連 unapply オブジェクトで遊んでいます。名前が「:」で終わると、右結合になることがわかっています。ただ、ネーミングには妙な制約があるようです

例 これらは無効です

object cons: { def unapply(value: String): Option[(Char, List[Char])] = ??? }
object :_cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? }

これらは有効です

object cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? }
object >>: { def unapply(value: String): Option[(Char, List[Char])] = ??? }

そのため、識別子に英数字と記号を混在させることには、いくつかの奇妙な点があるようです。

したがって、基本的には、「cons」などのわかりやすい名前を付けて、適切な結合性を維持したいと考えています。また、美的理由から演算子を対称にしたい :-) ので​​、あまり好きでcons_:
はありません。コロンを使用せずに何かを右側に関連付ける方法はありますか? またはこれを達成するための他の提案はありますか?

:_cons_:が最も近いようですが、何らかの理由で識別子が「:」で始まり、英数字を持つことはできません

4

1 に答える 1

3

仕様から(セクション 1.1):

識別子を形成する方法は 3 つあります。まず、識別子は文字で始まり、その後に任意の文字と数字のシーケンスが続きます。この後にアンダースコア「_」文字と、文字と数字または演算子文字で構成される別の文字列が続く場合があります。第 2 に、識別子は演算子文字で始まり、その後に任意の一連の演算子文字が続く場合があります。前の 2 つの形式はプレーン識別子と呼ばれます。最後に、識別子は逆引用​​符で囲んだ任意の文字列によって形成することもできます (ホスト システムは、どの文字列が識別子として有効かについていくつかの制限を課す場合があります)。識別子は、逆引用符自体を除くすべての文字で構成されます。

識別子が a で始まる場合、:演算子以外の文字を含めることはできません。ただし、次のように記述できることに注意してください(意味のあることを意図したものではなく、構文を示すだけです)。

scala> class X { def `:cons:`(i: Int) = i }
defined class X

scala> val x = new X
x: X = X@6a665da6

scala> 1 `:cons:` x
res1: Int = 1

メソッド名は引き続きコロンで終わるため、探している適切な結合性が得られます。

于 2013-08-01T11:59:31.647 に答える