もちろん、すべてのタイプに共通の祖先があることは理解していますが、私が言いたいのは次のことです。
動的型付け言語では、戻り値の型を「混合」するのが一般的です。一般的なケースは、データベースからデータを取得しようとする関数で、オブジェクト (見つかったデータで初期化) または FALSE (データが見つからない場合) を返します。
そのようなアンチパターンを示す小さな擬似コード:
function getObjectFromDatabase(object_id) {
if(result = db_fetch_object("SELECT * FROM objects WHERE id = %d", object_id) {
return result
} else {
return FALSE
}
}
オブジェクト ID のデータが見つかった場合、DB レコードがオブジェクトとして返されます。そうでない場合は、ブール値を取得します。もちろん、複数の可能な戻り値の型を処理するのは、クライアントである私です。
Scala でこれを達成する唯一の方法は、可能なすべての戻り値の型の共通の先祖を見つけ、それを署名の戻り値の型として宣言することですか?
// Like so:
def getObjectFromDatabase(objectId: Int): Any = {
val result = dbFetchObject("SELECT * FROM objects WHERE id = %d", object_id)
if(result) {
return result
} else {
return false
}
}
または、複数の可能な戻り値の型に注釈を付けることは可能ですか?
(関数の戻り値の型が可能な限り明確であることを強制されることを望んでいるため、これが可能になることを望んでいないことに注意してください。言語があいまいな戻り値の型を禁止していることを知って安心します。それが私が尋ねているより多くの理由です。)