extempore's answer に示されているように、過負荷になる可能性があります。デザインの決定に関するダニエルのコメントは正しいですが、不完全で少し誤解を招くと思います。オーバーロードが禁止されることはありませんが (可能であるため)、簡単には達成できません。
これにつながる設計上の決定は次のとおりです。
- 以前のすべての定義が利用可能でなければなりません。
- 毎回入力されたものすべてを再コンパイルするのではなく、新しく入力されたコードのみがコンパイルされます。
- 定義を再定義できる必要があります (Daniel が述べたように)。
- クラスやオブジェクトだけでなく、vals や defs などのメンバーを定義できる必要があります。
問題は、これらすべての目標をどのように達成するかです。あなたの例をどのように処理しますか?
def foo(x: Int): Unit = {}
def foo(x: String): Unit = {println(foo(2))}
4 番目の項目から始まる Avalまたはは、 、、またはdef内でのみ定義できます。したがって、REPL は、このように定義をオブジェクト内に配置します (実際の表現ではありません! ) 。classtraitobjectpackage object
package $line1 { // input line
object $read { // what was read
object $iw { // definitions
def foo(x: Int): Unit = {}
}
// val res1 would be here somewhere if this was an expression
}
}
現在、JVM の仕組みにより、それらの 1 つを定義すると、それらを拡張することはできません。もちろん、すべてを再コンパイルすることもできますが、それは破棄しました。したがって、別の場所に配置する必要があります。
package $line1 { // input line
object $read { // what was read
object $iw { // definitions
def foo(x: String): Unit = { println(foo(2)) }
}
}
}
そして、これはあなたの例がオーバーロードではない理由を説明しています.2つの異なる場所で定義されています. それらを同じ行に入れると、それらはすべてまとめて定義され、extempore の例に示すようにオーバーロードになります。
その他の設計上の決定に関しては、新しいパッケージごとに以前のパッケージから定義と "res" がインポートされ、インポートは互いにシャドーイングできるため、"再定義" が可能になります。