2012-03-11 10 views
9

私はアンダースコアが識別子のアルファベットと同じくらい自由度があるということを他の多くの言語から受け入れました。したがって、_vおよびv_。また、予約語(class_,case_)であいまいさを避けるために、末尾のアンダースコアはが推奨です。そのパーサと人間の両方が幸せになることができるように識別子のアンダースコアのためのスカラスタイルのガイドライン

val abc_=0 
<console>:1: error: '=' expected but integer literal found. 
     val abc_=0 

はScalaの型付けシステムの重要な一部であるアンダースコア、に推奨される方法は、識別子でそれらを使用何ですか?アンダースコアを持つ識別子がもたらす可能性のあるすべてのあいまい性は何ですか?

先導する空白は、class_ではなく、_classの混乱を招くようです。


関連質問:x_+のようなものが自分で有効な変数名をしているため

+2

[スタイルガイド](http://docs.scala-lang.org/style/naming-conventions.html)をご覧ください。 – agilesteel

+4

私はclass_を見たことがありません。私は通常、クリエイティブのスペルミス(例: 'clazz')があるのを見るか、Scalaではバッククックで囲むとキーワードを識別子として使うことができます。 –

+0

@SethTisue、私はPythonのPEP8スタイルのガイドからそれを得ました。私の悪い;それが標準だと思った。 – aitchnyu

答えて

15

末尾のアンダースコアは悪い考えです。末尾にアンダースコアを使用しないでください。

先行アンダースコアはあまりにも悪いことではありませんが、_myfunc _などの視覚的な解析はまだ難しいです。同じ名前のコンストラクタ引数を保持するプライベートメンバーが_class X(x: Int) { private var _x = x }で始まるようにするための規約があります。私の推薦はではありませんです。あなたは混乱を求めています。 myXまたはtheXまたはxLocalまたはxiなどを内部変数に使用します。それでも、もしあなたがとすれば、_xに行くなら、あなたは良い会社になるだろう。人々はあなたが何を意味するのかを知る傾向があります。

キャメルケースが標準であるため、名前の中のアンダースコアは広く使用されていません。私が行う例外は、手で使われることが予想されない暗黙のdef内にアンダースコアを使用し、その代わりに変換が行われている理由を述べることです。メソッドを追加してTuple2Tuple3に変換します。

6

あなたは1つの場所しかありません英数字とその他の間の識別子にアンダースコアが必要です。実際、あなたのケースではまさにそのようなことが起こります。パーサーは、あなたがval abc_=と宣言していて、その後に=を持っていないと思っています!最も一般的な用途は「セッター」メソッドです:私もpredicate_?を見てきました

def prop: String // or some other type 
def prop_=(v: String) 

の代わりに、より多くのJavaのようisPredicate

keyword_は頻繁には使用されませんが、使用している場合は、空白には注意しないでください。例えば、val abc_ = 0と書いてください。しかし、その点については、val abc = 0val abc=0よりも読みやすくなりますので、とにかに空白を入れてください。 Rex Kerrによると、_privateVariableは受け入れ可能ですが、推奨されません。

+1

あなたはなぜ「述語?」を知っていますか? "述語?"ではない。ちょっと興味があるんだけど。 –

+2

@EdStaub主に 'x + y'や' x = y'のようなものを書くことはできますが、パーサーはそれが単一の識別子だとは思っていません。 –