4

暗黙の変換はScalaの主要で物議を醸す機能のようですが、C#ではそれほど目立たないようです。2つの言語でのそれらの違いは何ですか?Scalaで暗黙的に使用することを余儀なくされている場所はありますか、それともC#のように変換を暗黙的にするか明示的にするかを常に選択できますか?多くの場合、C#では、コンシューマーが自分自身であっても、プログラマーの意図の型チェックを維持するために、変換を明示的にするのが好きでした。

C#もScalaもメソッド/関数パラメーターを暗黙的に分割または結合できないと言っているのは正しいですか?def myMethod(v1:Int、v2:Int)は、パラメーターリストとしてTuple2 [Int、Int]を受け入れず、def yourMethod(v1:Tuple2 [Int、Int])はパラメーターリストとして2つのintを受け入れません。 。おそらく、暗黙的/明示的なパラメータの分割/結合は、言語設計者によって考慮されている必要があります。複数の類似したグラフィックライブラリのポイント構造を使用する場合、この機能は望ましいと思います。

4

2 に答える 2

9

ScalaとC#の暗黙的な変換の主な違いは、Scalaのはるかに柔軟なスコープ規則です。これにより、どのスコープでどの暗黙的な変換を使用できるかを定義できます。

C#では、暗黙的な変換は、クラスの1つを別のクラスと見なすことができると言う方法ですが、Scalaでは、特定のコンテキストでのみ特定の機能を追加してクラスを装飾できます。

さらに、C#での暗黙的な変換はクラス自体で定義する必要がありますが、Scalaでは、暗黙的な変換を外部に追加できます。これは、既存のクラスを装飾するための強力なツールです。Scalaには、事前定義された明示的な変換のセットが付属しています。

于 2012-06-27T13:20:57.153 に答える
3

主要で物議を醸す機能

私はどういうわけか論争を逃したので、それが主要なものであるとは思えません。

暗黙の変換も利用できますが、詳細によっては、経験豊富なScala開発者が一般的に嫌悪感を抱いています。

「extension」クラスを介して型にメソッドを追加するための暗黙的な変換が存在する場合、それは受け入れられます。この拡張クラスは、パラメーター、定義、または変数の型として使用される型ではなく、そのメソッドがそれ自体を返すこともありませんが、該当する場合は元の型です。

暗黙の変換が、プログラムで通常使用される2つのタイプ間で変換される場合、それは悪いことと見なされます。実際、Scala 2.10には、この種の使用に対する警告が付属しています。

この違いは、JavaコレクションとScalaコレクションの間で変換できる2つのパッケージ、scala.collection.JavaConversionsとscala.collection.JavaConvertersにはっきりと見られます。後者は、前者で使用されている暗黙の変換スタイルが悪いと見なされたために正確に存在します。

Scalaを使用すると、特定のスコープ内で暗黙的な変換を使用できないようにすることができますが、それが使用されることはめったにありません。一方、フラグ-Xlog-implicit-conversionsを使用すると、暗黙的な変換が発生している場所を追跡できます。

Scalaのデフォルトのスコープには、暗黙の型変換は多くありません。Aは、Stringと見​​なすことができSeq[Char]、「プリミティブ」数値型には型の広がりがあります。つまり、小さい型は大きい型と見なすことができます。今は覚えていないものもあるかもしれませんが、一般的に言って、それを使用するには暗黙の変換をインポートする必要があります。

于 2012-06-27T15:24:30.047 に答える