私はシャドー変数が使いすぎると思います。なぜScalaはこの言語構造をサポートしていますか?それにはいくつかの強い理由があるはずですが、私はそれを見つけることはできません。なぜScalaはシャドー変数をサポートしていますか?
答えて
シャドウ内部スコープで宣言されたときに同じ名前の別の変数、メソッド、またはタイプがあり、外側を参照することができません-scopeエンティティを非修飾の方法で(あるいは時には全く)使用します。 JavaのようにScalaはシャドーイングを可能にします。
考えられる原因の1つは、Scalaではネストされたスコープが多数存在することです(JavaやC++などと比較して)。実際、ブロックは式が期待される場所であればどこからでも開始することができ、新しいスコープを開始することができます。内部スコープでのシャドーイング名の使用は、平均して宣言に近づき、あいまいではありません。
さらに、インラインクロージャは、プログラマーがすでに混雑しているスコープ内に新しい変数名を必要とすることがあります。シャドウイングを許可すると、他の奇妙な名前をつくるのではなく、すでに使用されている名前と同じであっても、ポイントに十分な記述名を使用することができます(my
、local
、または悪い場合は_
) - レター名...
シャドウイングは、良いIDEで問題になることは少なくなります。カーソルの下にある変数の宣言とその参照をソースコードで強調表示します。
ここにちょうど私の2セント...
詳細な返答をしてくれてありがとうと思います。 私は、クロージャのコンテキストで可変シャドウイングを考えました。いくつかの開発者がいくつかの新しい名前を付けるのではなく、クロージャの範囲に同じ名前を使用するのは間違いありません。私は、これらの開発者が使い方をより快適に感じていると思います。しかし、隠された脅威ではありませんか?ショートスコープ変数の接頭辞は完全ではないと私は同意します。しかし、それはほとんどの場合(特にScala初心者のために)コードを理解しやすくします。私が間違っているなら私を訂正してください。 –
私はシャドウ変数は、それらを使用するにはあまりにも危険だと思います。
あなたはあなたが望むものを考え出す権利があります。しかし、データ、研究、理由さえも提供していないので、その意見は価値がありません。
なぜこの言語構造をサポートしていますか?
ですので便利です。プログラマーは、スコープ内の一部の識別子がすでにそれを使用しているという理由だけで、任意の識別子名を作成する必要はありません。
ワイルドカードのインポートは、使用している識別子を第三者が追加したためにコンパイルが中断する可能性がなくなり、より便利になります。
それにはいくつかの理由がありますが、私はそれを見つけることができません。
なぜ、その理由がありますか?それには利点があり、欠点がない場合(あなたは何も提示していません)、それで十分です。答えは
EDIT
欠点を説明し、私はシャドウイングの特殊なケースであると言わなければなりません。また、シャドウイングは、import
ステートメントまたはネストされたpackage
ステートメントと同じパッケージ内のすべてを介して、インポートのすべてに影響します。
// Not allowed, because it shadows List
import java.util._
class A {
// Not allowed, because it shadows this, hashCode, equals, toString
class B
}
非常に迷惑な言語になるだろう:
は、いくつかの例を見てみましょう。
シャドー変数の危険性はあまりにも明白で、最初の質問でそれを記述することはできません。 BTW **私はジャン=フィリップスの答えに対するコメントに**書きました(恐らくあなたはそれを読んでいません)。しかし、あなたのために特別に私は繰り返すでしょう。 –
誰かがあるスコープで変数を宣言し、この変数が外部スコープ内の別のスコープと同じ名前を持つとき、彼はコードをより複雑にします。この変数のそれぞれの意味を追跡することははるかに困難です。ここでは、 'Programming in Scala'という言葉を引用しています: "変数名がネストされたスコープで新しい意味を採用するので、このようなコードは読者にとって非常に混乱する可能性があることを覚えておいてください。外側の変数をシャドーします。 –
@keykeeper [OK]を、私はその議論への答えを入れます。 –
- 1. なぜVisual Studioは配列サイズの変数をサポートしていませんか?
- 2. Scalaのパターンマッチングが変数で機能しないのはなぜですか?
- 3. mongo-scala-driverはGridFsをサポートしていますか?
- 4. FortifyはPython、Scala、Apache Sparkをサポートしていますか?
- 5. C#は可変数の引数をサポートしていますか?
- 6. なぜjQueryイベントモデルはイベントキャプチャをサポートせず、イベントバブリングをサポートしていますか
- 7. なぜpandas read_csvは複数のコメント(#、@、...)をサポートしていないのですか?
- 8. リバースイテレータをサポートしていないのはなぜですか?
- 9. 私はEmacsでfind-fileをシャドーしようとしていますが、なぜこの関数が引数について叫んでいますか?
- 10. なぜOpenGLはミップマップをサポートしていますが、インテグラルイメージはサポートしていませんか?
- 11. openclはブール変数をサポートしていますか?
- 12. DOT言語は変数/エイリアスをサポートしていますか?
- 13. Laravelは変数を永久にサポートしていますか?
- 14. なぜhttp preconditionヘッダーフィールドは複数のetagsをサポートしますか?
- 15. なぜOCamlはレコードのサブタイプをサポートしていませんか?
- 16. なぜMicrosoft.NETCore.Appはnetstandard1.6をサポートしていませんか?
- 17. なぜEloquentはバッチインサートをサポートしていませんか?
- 18. なぜSilverlightはBMP/JPEG/PNGBitmapEncoderをサポートしていませんか?
- 19. なぜスレッドクラスはクローンメソッドをサポートしていませんか?
- 20. なぜContinueWhenAllとContinueWhenAnyはTaskContinuationOptionsをサポートしていませんか?
- 21. なぜRealmは自動インクリメントプライマリキーをサポートしていませんか?
- 22. なぜInterlocked.Exchangeはブール型をサポートしていませんか?
- 23. なぜNodejsはインポートとエクスポートをサポートしていませんか?
- 24. なぜデータフローはSortByKeyをサポートしていませんか?
- 25. なぜAzure SQL DWはError_Line()関数をサポートしていませんか?
- 26. なぜClojureはマクロ内のプライベート関数をサポートしていませんか?
- 27. apache thriftは関数の変数をパラメータとしてサポートしていますか?
- 28. なぜif-else文を使ってconst変数の初期化をサポートしていないのですか?
- 29. インスタンス変数を使用してインターフェイス変数をシャドーする方法
- 30. Scala関数の引数はクラス変数になりますか?
私は同じことを考えました。おそらく、OderskyらはJavaを考慮しないでその動作を単純に実行したのかもしれません。 – laher
私はオデスキー氏が特定の言語構成について何らかの意思決定を行う動機があると思います。 :) –
:)フェア十分です。彼はコンパイラの警告で十分だろうと思った。私はscalacがコンパイラオプションをとることを見ることができます.-ワーニングシャドーイング、おそらくIDEもサポートしています。 – laher