Oczywiście zdaję sobie sprawę, wszystkie typy zrobić mają wspólnego przodka, ale co mam na myśli to:Czy funkcja zwraca jeden z wielu typów, które nie mają wspólnego przodka?
W dynamicznie typowanych języków, jest to powszechna praktyka mieć „mieszane” typy powrotne. Typowym przypadkiem jest funkcja, która próbuje pobrać dane z bazy danych, a następnie zwraca obiekt (zainicjalizowany znalezionymi danymi) lub FALSE (w przypadku braku danych).
Trochę pseudokod wykazać tylko taką anty-wzorzec:
function getObjectFromDatabase(object_id) {
if(result = db_fetch_object("SELECT * FROM objects WHERE id = %d", object_id) {
return result
} else {
return FALSE
}
}
Jeśli dane można znaleźć na moim ID obiektu, otrzymuję rekordu DB powrotem jako przedmiot. Jeśli nie, otrzymam wartość boolowską. Wtedy oczywiście to ja, klient, obsługuję wiele możliwych typów zwrotu.
Czy jest to jedyny sposób, aby to zrobić w Scali, aby znaleźć wspólnego przodka dla wszystkich możliwych typów zwrotu i zadeklarować to jako typ zwrotu w podpisie?
// 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
}
}
Czy możliwe jest przypisywanie wielu możliwych typów zwrotu?
(Zauważ, że nie mam nadzieja możliwe jest, aby to zrobić, jak bym go wolą być egzekwowane, że typy powrotne funkcja są tak jednoznaczne, jak to możliwe. Wydaje się jako pomoc do mnie, aby dowiedzieć się, że . język zabrania niejednoznaczne rodzajów powrotne, które jest bardziej powodem pytam)
'Albo' jest prawidłowym wyborem tylko wtedy, gdy zamierzony typ powrotu może logicznie być tylko jednym z 2 typów. Nie jest to dobre logiczne rozwiązanie, jeśli koncepcyjnie możesz później dodać inny typ. tj. nie ma czegoś takiego jak "Albo [Int, String, Double]" – Adrian