【发布时间】:2009-10-07 07:05:43
【问题描述】:
我一直在研究 Scala 中的类型推断,关于为什么在某些情况下必须显式声明表达式/方法返回类型,我想更好地理解一些事情。
显式 return 声明
示例(如果省略了return 关键字,则有效):
def upCase(s: String) = {
if (s.length == 0)
return s // COMPILE ERROR - forces return type of upCase to be declared.
else
s.toUpperCase()
}
为什么不声明返回类型就不能使用显式类型的参数作为返回值?这不仅适用于直接参数引用,也适用于任何“类型可推断”的表达式。
方法重载
示例(添加第二个joiner方法时编译失败):
def joiner(ss: List[String], sep: String) = ss.mkString(sep)
def joiner(ss: List[String]) = joiner(strings, " ") // COMPILE ERROR WHEN ADDED
【问题讨论】:
-
也许一个例子来说明 Scala 应该做什么以及它做什么会是个好主意!
-
由于
joiner方法被重载,您的第二个示例在没有显式返回类型的情况下无法编译 - 尽管同样不完全清楚为什么 Scala 需要此限制 -
我编辑了这个问题,希望它会得到社区更好的处理。这有点争论,但这里是一个有趣的问题。 OP - 如果您对我的编辑不满意,请随时回滚(或要求我回滚)。
-
再次感谢您的关注。我不想变得“好斗”;你的修改很棒。
-
我目前对这些怪癖的怀疑是设计师关心的是编写单遍编译器;另外,我认为这里涉及到编译速度。我这么说是因为我想要的功能可以很容易地添加,从而导致(非常)少的开销。实际上,我不知道 'scalac' 是否是单通道)
标签: scala type-inference