プログラミング言語がどれほど愛されていても、その中にはあまり良いものではないいくつかの詳細が常にあります。
この質問では、特に構文要素に焦点を当てたいと思います。頻繁に使用するプログラミング言語(お気に入りのプログラミング言語、または職場での使用を余儀なくされている言語)で、最も読みにくい、不明瞭、不便、または不快な構文要素はどれですか。
プログラミング言語がどれほど愛されていても、その中にはあまり良いものではないいくつかの詳細が常にあります。
この質問では、特に構文要素に焦点を当てたいと思います。頻繁に使用するプログラミング言語(お気に入りのプログラミング言語、または職場での使用を余儀なくされている言語)で、最も読みにくい、不明瞭、不便、または不快な構文要素はどれですか。
回答:
あまり噛まれたことはありませんが、頭が回るほど驚くほど悪い考えです。
ルールは次のとおりです(ECMA-262セクション7.9から)
例:
return 1; // returns 1
return
1; // returns undefined
/**
* Name of user
*/
private String name;
/**
* Gets name of user
* @return Name of user
*/
public String getName() {
return this.name;
}
/**
* Sets name of user.
* @param name
*/
public void setName(final String name) {
this.name = name;
}
ああ!
私がこれに関して持っている問題
getX
、getY
、getZ
、getAnotherAnnoyingField
、getWhyIHateJavaBeans
、getThisIsVerbose
、getGAH
...ああ、それは、そこにありますhashCode
。public
。メンバーはプライベートである必要があり、クライアントコードからのゲッターとセッターではなく、より高いレベルのロジックを持つクラスによって賢明に操作される必要があります。
Pythonはこの点で私を困らせます。とにかく適切にインデントしますが、それは私がしなければならないバグです。プレゼンテーションの一部を構文の一部にすると、私はいらいらします。
switch
(などのC、C ++、C#、Javaの、中)の文これが非常に不便である理由の例を次に示します。
switch (someVariable)
{
case 1:
int i = something();
doSomething(i);
break;
case 2:
int i = somethingElse();
doSomethingElse(i);
break;
}
変数i
は同じスコープ内で再宣言されるため、これはコンパイルされません。これは些細なことのように思えますが、本当に頻繁に噛みつきます。中括弧を追加して軽減することもできますが、中括弧が構文の必須部分であり、インデントの余分なレベルが余分にない場合は便利でした。私も余分を書くことが本当に嫌いbreak
です。これははるかに良いでしょう:
switch (someVariable)
case 1
{
int i = something();
doSomething(i);
}
case 2
{
int i = somethingElse();
doSomethingElse(i);
}
default
{
...
}
これにより、if
/ else
チェーンのように見えますが、意味的にも似ているので、これは良いことです。少なくともC#では、同じことではありswitch
ません。ステートメントではcaseラベルの順序は重要ではありませんが、if
/ else
では重要だからです。
goto
C#で既に行われているように、より明示的に(または同様のものを使用して)作成するだけです。
case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;
。
break
で、デフォルトがデフォルトであり、指定する必要があるのはフォールスルーだけだと想像してください。コメントする必要はもうありません!:)
VB.NETで固定配列を初期化するとき、C / C ++、PHP、またはJavaのような要素の数ではなく、配列の上限を指定していることを常に忘れています。VB6(私たちはそこに行きません...)以外に、私はそれをこのようにする他の言語を考えることができません:
Dim myArray(20) as Integer '# Creates an array with 21 elements,
'# indexed from 0 to 20
ほとんどの言語では、変数を宣言して1行のコードで割り当てることができます。一方、VB6は2つを使用するように強制します。
Dim i as Integer
i = 0
Dim derpderp as Collection
Set derpderp = new Collection
コロンを使用して2つのコマンドを1行に入力できますが、実際のコードではすぐに乱雑になります。
Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection
Dim Hurp As New Collection
アクセスHurp
するとNothing
、アクセスする前に魔法のように初期化されます。明示的に設定しNothing
て再度タッチすると、復活します...あえぎます!
//
PHPやJavascriptなどの他の多くの言語でのように、コード行をコメントアウトしません。けれども/* this is commented out */
作品、私が使用することを好みます//
。
迷惑なのは、CSSを編集しているときに忘れて半分の時間を過ごした後、戻ってエラーを修正する必要があるためです。
PHPには、配列または文字列で考えられるほぼすべての操作を実行するための便利な関数が多数あります。これらの操作の多くはa $needle
とaの両方を使用する必要があります$haystack
が、異なる関数は異なる順序でそれらを受け取ります。どの関数がどの引数を必要とするかは、どれほど頻繁にそれらに遭遇しても、私の脳が吸収することを拒否する事実の1つです!
// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])
// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])
おもしろいことに、PHPはこれらの順序と内部的に一貫しているように見え$haystack, $needle
ますが、配列関数は逆の方法ですべての文字列関数を使用しているように見えますが、PHPに慣れていない人には少し慣れる必要があります。ExpressionEngineには、この特定の癖について詳しく説明した良い投稿があります。また、PHPバグリストに関する議論もあります。
helly@php.net
その後、適切なIDEを使用します。
$needle
、$haystack
それは言うの道連想させるとして、干し草の山で針を見つけることを。
strstr
です。とても美しく無意味。
self
インスタンスメソッド定義のパラメーター
self
ことは簡単に起こり、時間を要します。
期間。完全停止。話の終わり。
どこから始めれば?ああ、私はどこから始めるべきかを知っています:Javaのめちゃくちゃ複雑でく、愚かで本質的に壊れたジェネリック。もっと言う必要がありますか?:(大丈夫、その後:erasureと入力します。
次に、非決定的なリソース管理があります。ケウル・フッチャー!
次は何?そうそう:Javaの愚かな正規表現は、私にとって最も刺激的で、熱狂的な牛肉です。十分なバックスラッシュがなかったために何回もホースを切った回数を数えられません。これは、このミレニアムから完全な強気であるUnicodeプロパティにアクセスできないことよりもさらに悪いことです。 時代遅れの10フリックな年!!! 完全に役に立たない。それをゴミ箱に。
それから、文字クラスのショートカットが非ASCIIでは機能しないというバグがあります。なんて王室の痛み!そして、使用することさえ考えないでください\p{javaWhiteSpace}
。いくつかの非常に一般的なUnicodeホワイトスペースコードポイントでは正しいことを行いません。
\p{javaJavaIdentifierStart}
プロパティがあることをご存知ですか?彼らは何を考えていましたか?彼らがそのようなスマートな覗き見者を苦労して得てくれてうれしい。
CANON_EQフラグを使用しようとしたことがありますか?本当にそうなのか、そうでないのか知っていますか?いわゆる「Unicodeケース」はどうですか?たくさんの通常のケーシングはまったく機能しません。
次に、保守可能な正規表現を作成するのが難しくなります。Javaはまだ複数行の文字列の書き方を理解していないので、次のような非常識なことを書くことになります。
"(?= ^ [A-Z] [A-Za-z0-9\\-] + $) \n"
+ "(?! ^ .* \n"
+ " (?: ^ \\d+ $ \n"
+ " | ^ [A-Z] - [A-Z] $ \n"
+ " | Invitrogen \n"
+ " | Clontech \n"
+ " | L-L-X-X \n"
+ " | Sarstedt \n"
+ " | Roche \n"
+ " | Beckman \n"
+ " | Bayer \n"
+ " ) # end alternatives \n"
+ ") # end negated lookahead \n"
これらのすべての改行は何ですか?ああ、ただのJavaの愚かさ。行末まで行くJavaコメント(ばか!)ではなく、Perlコメントを使用しました。そのため、それら\n
のをそこに配置しない場合、パターンの残りの部分を切り落とします。当たり前とダブル当たり!
Javaで正規表現を使用しないでください:物事を壊したいだけになります、それはすべてとても痛くて壊れています。私は人々がこれに耐えることを信じることができません。 しない人もいます。
次に、エンコーディングのJavaのばかげたナンセンスについて話し始めることができます。まず、Javaの文字がUnicodeであるにもかかわらず、デフォルトのプラットフォームエンコーディングが常に8ビットの不完全なエンコーディングであるという事実があります。次に、エンコードエラーで例外を発生させない方法があります。あなたはがらくたを得ることが保証されています。またはこれはどうですか:
OutputStreamWriter(OutputStream out)
Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs)
Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName)
Creates an OutputStreamWriter that uses the named charset.
違いは何ですか?エンコードエラーが発生した場合、そのうちの1つだけが例外を発生させることをご存知ですか?残りはただそれらに銃口をかけます。
それから、キャラクターを保持するのに十分ではないJavaのcharの白痴があります!彼らは一体何を考えているのでしょうか?それが私がそれらをcharcharsと呼ぶ理由です。正しく機能することが期待される場合は、次のようなコードを記述する必要があります。
private static void say_physical(String s) {
System.out.print("U+");
for (int i = 0; i < s.length(); i++) {
System.out.printf("%X", s.codePointAt(i));
if (s.codePointAt(i) > Character.MAX_VALUE) { i++; } // UG!
if (i+1 < s.length()) { System.out.printf("."); }
}
}
そして、誰がそれをすることを考えていますか?誰の隣にも。
キャラクターは何人い"\uD83D\uDCA9"
ますか?一つか二つ?あなたがそれらを数える方法に依存します。正規表現エンジンはもちろん論理文字を扱うため、パターン^.$
は成功し、パターン^..$
は失敗します。この狂気はここに示されています:
String { U+61, "\u0061", "a" } =~ /^.$/ => matched.
String { U+61, "\u0061", "a" } =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^..$/ => matched.
完全に合理的なを書くことができないので、その馬鹿げたことがすべてです。\u1F4A9
もちろん、あなたはそれができないという警告を受け取りません。間違ったことをするだけです。
愚かな。
私たちがそれに取り組んでいる間、\uXXXX
記法全体は先天的に脳死です。Javaのプリプロセッサは(はい、あなたは私を聞いた Javaはありません前にはのような完全に合理的なものを書くことから禁止されているので)、それを取得"\u0022"
するJavaはそれを見ている時間によって、そのプリプロセッサはにそれを回したので、"""
あなたが失うので、。ああ、待って、それが正規表現である場合ではありません!だからあなたは"\\u0022"
うまく使うことができます。
いいね!
Javaにはisatty(0)
呼び出しを行う方法がないことをご存知ですか?あなたはそのような考えを考えることさえ許されていません。それはあなたにとって良くないでしょう。
そして、クラスパス全体の憎悪があります。
または、同じソースファイルに Javaソースファイルのエンコーディングを指定する方法がないため、失わないようにしますか?もう一度私は知っておく必要があります:地獄は何でしたか?
狂気を止めろ!私は人々がこのゴミに耐えるなんて信じられない。それは完全な冗談です。私は、とんでもないジャワの狂気のスリングや矢に苦しむよりも、むしろウォルマートのグリーターになりたいです。それはすべて壊れており、彼らはそれを修正できないだけでなく、修正もしません。
これは、printf()
機能を持つことを違法にした言語を自慢した同じ愚かな人によるものです。ジー、それは確かに本当にうまくいきましたが、そうではありませんでした!?
薄手のしびれ。ビッチスラップは彼らにとって親切すぎます。アセンブラーでプログラミングしたい場合は、そうします。これは救済可能な言語ではありません。皇帝には衣服がありません。
嫌いです。私たちはそれを永遠に嫌います。ダイダイダイダイ!
^H
)で構成される名前が付きます:)
CおよびC ++の関数ポインター宣言構文:
(int)(*f)(int, int);
これは、ポイントf
先が2を取りint
、を返すことができるという名前の関数ポインタを宣言しますint
。
私はこのような構文をはるかに好むでしょう:
f: (int, int) => int
あなたが関数ポインタを宣言したいとしg
、その指示先2取ることができますint
秒からの機能int
とint
のint
、およびリターンをint
。
CまたはC ++表記では、次のように宣言します。
(int)(*g)(int, int, int(int, int));
上記の表記法を使用すると、同じものを次のように宣言できます。
g: (int, int, (int, int) => int) => int
後者は、はるかに直感的なIMOです。
余談:OOCと呼ばれるプログラミング言語は、この構文(およびCおよびC ++のさまざまな構文上の問題)を修正します。ここでホームページをチェックしてください。
Javaの冗長性。
すなわち:
public static final int
const int
例えば。
a+(b*c)/d*e+f/g^20
しBigInteger
てみてください。なぜこの言語は演算子のオーバーロードを許可しないのですか?
構文は見苦しいだけでなく、新しい開発者が文字列の名前空間について考える必要がある場合に混乱を招きます。(PHPは、二重引用符で囲まれた文字列のバックスラッシュをエスケープシーケンスとして補間します。\you\should\never\do\that
単一引用符で囲まれた文字列ではなく、二重引用符で囲まれた名前空間を表現しようとすると、改行、タブ、災害が発生します。)
if / while / forステートメントの後に中括弧をオプションにすることができるという事実を軽deしています。
特に次のようなコードを見ると、
if (...)
for(...)
... One line of stuff ...
中かっこを入れて完了です。
for (...) while (...) if (...) { x(); y(); }
書き直す方for (...) { while (...) { if (...) { x(); y(); } } }
が適切です。
ほぼすべての実用的な言語とは異なり、VBScriptは論理演算子ではなくビット演算子を使用します。これは実際にはどういう意味ですか?まあ、ようエリックリペットは指摘します:
If Blah = True Then Print "True!" Else Print "False!"
そして
If Blah Then Print "True!" Else Print "False!"
VBScriptでは同じではありません!
さらに悪いことに、しかし、次の文は、なるように、VBScriptのには短絡評価この手段がないことをクラッシュあなたのプログラムを場合Blah
、ISは、Nothing
If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...
そうです、VBScriptは、最初の部分が偽であっても、AND比較の両方の部分を評価します!ただそれを...
If x Then ... If Not x Then ... End If ... End If
を見つけてxが2であることが判明するまで、VB / VBScriptで実際にプログラミングしたことはありません。
編集:コメントの議論に続いて、私は自分自身をよりよく説明するためにこの答えを更新することにしました。
Cでの関数ポインターの見方は本当に嫌いです。通常、変数宣言は次のタプルのように見えます。type varname;
一方、関数ポインター宣言は、関数名の前に*が付いた関数の宣言のように見えます。私はこれをポインタ型の記述として受け入れることができますが、Cでは、その型の変数の型と名前の両方を宣言します。それ以外の場合、型宣言は変数宣言とは区別されるため、これは矛盾しているように見えます。struct myStruct{int X; int Y;}
型のみを定義し、という名前の変数は定義しませんmyStruct
。同様に、型の宣言と変数の宣言を関数ポインターで1つのアトミックステートメントにグループ化する理由も見当たりませんし、type varname;
構造からの逸脱も認めません。
あるスパイラルルールと一致することを誰かが指摘しましたが、それは事実かもしれませんが、良い構文の特徴は、それが自明であり、その内部ロジックが明らかであることです。スパイラルルールは、決して明らかではありません。
typedef
た理由です。
入力/出力引数。私はすべての議論に賛成です(私は良いことです)、アウト引数も素晴らしいですが、これら2つの状態を伝えなければならない議論は私を怒らせます。
ここで対象とするのは、パラメーターから入力を取得し、その入力を何らかの出力で上書きする関数です。参照によってオブジェクトを渡して更新することは問題ありません。しかし、ほとんどのプリミティブ型では、オブジェクトを取得して使用し、それから完全に変更することは私には正しくありません。inoutを介して引数の意味を変更しないでください。
in
ためにあなたが言う必要のある言語を見たことはありませんin
、私はそれらについて話しているだけです。また、私の意見では、何も /アウト引数を言い訳することはできませんし、それらを明示的にすることは、痛みを緩和しません。ローカル変数を関数に役立つ値で初期化し、この同じ変数に関数がそこに置くことを決めたものを突然含める必要がある理由はないはずです。これら2つは区別する必要があります。常に。
struct
、新しい値が値に依存する場所の更新同じ別のフィールドのstruct
。)
class
関数によって変更される参照によって渡されるオブジェクト(C#のオブジェクトのインスタンスなど)は、私にとっては問題ありません。定数でない構造体が嫌いなことはさておきstruct
、ref
キーワードでa を渡して更新することもできます。私が本当に嫌いなのは、入力が出力で上書きされるときです。私が考えることができる最良の例は、バークレーソケットのaccept
関数です。socklen_t*
入力には、struct sockaddr*
渡したサイズを含める必要がある引数が必要です。出力には、書き込まれたバイト数が含まれます。これは犯罪的です。
通常、変数宣言の形式はですtype variable_name
。これらの宣言は、左から右に簡単に読むことができます。しかしint foo[size]
、最初foo
はintとして宣言しているように見えます。その後、さらに読むと、fooが「整数の配列」型であることがわかります。 int[size] foo
読みやすくなりました。
また、プログラマーが同様の理由でこのようなポインターを宣言するときも嫌いですint *foo
。どういうわけか私は理解していませんが、それはそれが書かれている典型的な方法です。
int* a, b;
ため、そのように書かれています。だから、*しない宣言a
やb
ポインタとして。のみa
です。したがって、次のように記述する方が適切ですint *a, b;
(または、2つの宣言として記述する方が適切です)。
*
ので、型にバインドしません。
void(int) *f;
?いいえ:void (*f)(int);
int* a, b;
あなたが述べた問題はもっとひどいものだと思います。
Javaでの冗長なパラメーター化:
HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();
コンパイラは、他にどのような型のパラメーター化を行うことができると考え foo
ていますか?
HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
HashMap<String,HashMap<String,String>> foo = new HashMap<>();
What other type parameterization does the compiler think foo could have?
-何らかの理由でそれは生のタイプです-誰かが正気で生のタイプとパラメータ化されたタイプを混在させるかのように。
人々は既に=
vs. について不満を述べているので==
、もっと悪い代替案を指摘させてください。PL / Iは両方を持っていた:=
と=
、しかし、何かが「明らかに」割り当てたとき、それはあなたが使用して逃げる聞かせ=
それを行うこと。を使用:=
すると、コンパイラがそれを比較として解釈するような状況で何かを強制的に割り当てることができます。
残念なことに、コンパイラは常に予想どおりに物事を決定するわけではありませんでした。明らかな例を1つだけ考えてみましょう。
A = B = 0;
さて、ほとんどの「普通の」言語に精通しているほとんどの人にとって、この意味は非常に明白です。AとBの両方に0を割り当てます。PL/ Iは少し...違います。言語の(非常識な)設計者のみが知っている理由により、=
は割り当てとして解釈されますが、2番目=
は比較として解釈されます。したがって、これはBを0と比較し、その比較の結果をAに割り当てます(「false」の結果が0、「true」が1になるというCスタイルの規則に従います)。
したがって、Bが0の場合、Aは1になります。それ以外の場合、Aは0になります。つまり、AとBに同じ値を割り当てるのではなく、実際にA が Bと同じ値を持たないようにします。
結論:C / C ++ / PHPスタイルは最初は苦痛のように見えますが、代替案ははるかに悪い1です。
1技術的には、別の代替=
手段があり:=
ます。パスカルスタイルでは、常に比較と割り当てが必要になります。しばらくそれを使用した後、割り当てが比較よりも十分に一般的であることはかなり明白です(少なくとも2つを明確にするために余分な「もの」が必要な場合は、間違いなく割り当てを清潔でシンプルにしてください)比較には余分な「グランジ」が必要であり、逆は必要ありません。
==
平等と:=
割り当てに使用することさえ提案します。このように入力する必要がありますが、孤独=
を避けることはバグを避けるのに役立ちます。
if($x < 10) do_something();
。現時点では、どちらかdo_something() if($x < 10);
またはとして記述する必要がありますif($x < 10) { do_something(); }
。do_something() if ($x < 10);
悪くありません。
if(..) ...
、すべての式を右側に揃えることができるため、起動するよりもずっときれいです。しかし、私は本当に言いたいことがありますif($x < 10) do_something();
、そして、Perlが私を許さないのは残念です。
if ($x<10) do_something(); and_call_me();
からなぜ電話をかけないのか不思議に思うまでは残念です。そのタイプのエラーを防ぐために、Cと家族が中括弧を必要とすることを望みます。
else
ます。(私はそれを持っていたいEXPR1 if COND else EXPR2
Pythonが持っているように)
reinterpret_cast<unsigned long>
C ++で。この操作は、外部のAPIを処理し、数値の精度を確保するのに役立ちます。なぜ入力するのがそんなに苦痛で、見るのがsoいのでしょうか?
reinterpret_cast
。C++でa を使用することは非常に強力なコード臭です。99%の確率で、これを使用しようとするとき、チャンスがあります。必要はないはずです-おそらく何か間違ったことをしたでしょう。他の1%の時間、あなたはCとインターフェースをreinterpret_cast
とっています。そうしないと、型システムを壊して何かを機能させることができます。それは通常悪いことです。
JavaScript のfor ... inコンストラクト、および配列をループするときのPHP のforeachコンストラクト。どちらも正しいコードよりもバグを書きやすくします。
C / C ++の配列のポインターまたはポインターの配列。私はまだこれらについて混乱しています。
int[]*
は整数int*[]
の配列へのポインターであり、整数へのポインターの配列です。const
sでもうまく機能します:int* const
は整数への定数ポインターですが、const int*
とint const*
は定数整数(または整数定数)へのポインターです。
int (*p)[10];
宣言p
します。場合はsizeof (int) == 4
、その後、p++
進めるp
40で
Javascript / Javaなど、比較と等しい、例えばif(a == 1)
if(a = 1)を何回書きますか?
私は人間としてそれを完全に読みました。しかし、インタープリター/コンパイラーは、「aに1を割り当ててから、aが1に等しいかどうかを確認し、そうだと信じますか!」と言います。
私を壁に追いやる。
if(a == 1)ははるかに読みにくく、インタプリタ/コンパイラはとにかく私が何を意味するかを知っているはずです。他の多くの下位言語(VB)は何百年もの間、うまく機能してきました。
if (a = true)
意味ですか?
if (a == true)
、書いてくださいif (a)
。を意味する場合a = true
、if
ステートメントは冗長です。
structPointer->member
C / C ++で。他の人のコードを読むのに良いかもしれませんが、私はそれが好きではありません。1人ではなく2人のキャラクター...スペースの無駄だ!
.
。これは、非ポインターオブジェクトのメンバーに適用されます。あいまいな構文は悪いですね、mmmkay?
shared_ptr
場合は、->
含まれているタイプにアクセスして.
のプロパティにアクセスshared_ptr
自体を?申し訳ありませんが、ここではまったく同意しません。
->
は、何かのメンバーにアクセスするために使用する必要があります。
括弧内のScala複数行コード
例えば:
class Foo(
val bar: String,
val baz: Int,
val bing: String,
val bong: Boolean
) extends Model {
// body here
}
あなたが実際にそれから得るものは素晴らしいです。それはあなたのためにコンストラクタとゲッターとセッターを生成します。しかし、それは確かにく、コードをインデントする方法の私のすべての精神的なモデルを壊し、基本的に私は一方がJavaで他方がLispである奇妙なサンドイッチのように感じます。(ああ、待って...それがScalaのポイントです。)
val bar
など)または中括弧内の部分(次の部分)を意味しますextends Model
か?(そのコードには括弧はありません)