当然,我意识到所有类型都有一个共同的祖先,但我的意思是:
在动态类型语言中,具有“混合”返回类型是一种常见的做法。一个常见的情况是一个函数尝试从数据库中检索数据,然后返回一个对象(用找到的数据初始化)或 FALSE(如果没有找到数据)。
一个小伪代码来演示这种反模式:
function getObjectFromDatabase(object_id) {
if(result = db_fetch_object("SELECT * FROM objects WHERE id = %d", object_id) {
return result
} else {
return FALSE
}
}
如果为我的对象 id 找到数据,我将返回一个数据库记录作为对象。如果没有,我会得到一个布尔值。然后,当然,由我(客户)来处理多种可能的返回类型。
是在 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
}
}
或者是否可以注释多种可能的返回类型?
(请注意,我不希望这样做,因为我希望强制函数返回类型尽可能明确。得知该语言禁止模棱两可的返回类型,这让我松了一口气,这就是我要问的原因。)