2012-05-29 9 views
10

私はちょうど奇妙なクラス名を持ついくつかのScalaのコードを見つけました!クールなクラスとメソッド名は ``:class `'にラップされていますこれはクールなクラス` {}ですか?</p> <pre><code>class `This is a cool class` {} </code></pre> <p>とメソッド名::私たちはクラスやメソッド名のための文を使用することができます</p> <pre><code>def `cool method` = {} </code></pre> <p>

これは、ユニットテストのための非常にクールで便利です:

class UserTest { 
    def `user can be saved to db` { 
     // testing 
    } 
} 

しかし、なぜ私たちはこれを行うことができますか?それを理解する方法?

答えて

15

この機能は、相互運用性のために存在します。 Scalaに予約語(たとえばwith)がある場合は、それをメソッドや変数などとして使用する他の言語のコードを引き続き参照することができます。

ほとんど任意の文字列を禁止する理由はなかったので、ほとんど任意の文字列を使用できます。

+2

+1はバッククォートがある理由について*理由*を与えるために+1します。 – Frank

+0

OPのユースケースも考慮されている可能性があります。そうしないと、C#がどのようにそれを行うのかと同じように、単一のシンボルだけが引用符で囲まれた識別子を示す必要があります。 –

+0

@jk。 - Scalaのレキシングが他の人と同じように動作する場合のみ。 JVM仕様では、メソッド名としてほとんどすべてを使用できます。 ScalaがJava互換のシンボルのエンコード(例えばスペースは$ u0020になります)と未処理のバージョンの両方をチェックするのに十分なほどスマートなのかどうかはわかりませんが、メソッド名に非標準文字を入れる言語を書いた人がいます。 –

2

にラップされた文字列 'は、クラス名やメソッドだけでなく、関数や変数にも有効な識別子です。

1

私にはパーサとコンパイラがそれを可能にする方法でビルドされているので、Scalaチームはそれを実装しました。

getThisIncredibleItemまたはget_this_other_itemではなく、関数に実際の名前を付けることがコーダーにとって魅力的だと思います。

Scalaで何か新しいことを教えていただきありがとうご質問ありがとうございます!

5

Scalaの言語仕様:

識別子を形成するための3つの方法があります。最初に、識別子は の文字で始まり、その後には の文字と数字の任意のシーケンスを続けることができます。これに続いて、_のアンダースコアと、文字と数字の組み合わせの文字列、または のオペレータ文字が続きます。第2に、識別子はオペレータ 文字から始まり、任意のシーケンスのオペレータ文字が続きます。 上記2つの形式は、プレーン識別子と呼ばれます。最後に、 識別子は、 バッククォートの間の任意の文字列で構成することもできます(ホストシステムでは、識別子に合法的な文字列である がいくつかの制限を課すことがあります)。識別子は、バッククォートそのものを除くすべての文字の で構成されます。

7

@Rex Kerrと回答したこの機能は、相互運用性のための機能です。たとえば、Javaのメソッドを呼び出すために

は、あなたがyield以来

Thread.`yield`() 

を記述する必要が

Thread.yield() 

は、Scalaではキーワードです。

関連する問題

 関連する問題