在scala中,使用函数名作为返回值?

时间:2012-09-17 04:33:15

标签: scala

当我第一次遇到以下代码时,我很困惑。

在类Element中,有三个函数定义。

为什么高度和宽度可以直接使用内容作为Array [String]的变量?

是因为Scala中的每个函数都是一个对象还是其他一些规则?

我来自C ++世界,所以这个定义真的让我很困惑。

abstract class Element {
  def contents: Array[String]
  def height: Int = contents.length
  def width: Int = if (height == 0) 0 else contents(0).length
}

2 个答案:

答案 0 :(得分:6)

这只是语法。例如,表达式contents.length被编译为contents方法的调用,然后在结果上调用length方法。

通常,零参数方法调用可以省略括号。实际上,在调用方法时,例如contents方法,在其定义中没有无参数列表的方法时,必须忽略括号

请注意,此功能是Scala对uniform access principle的承诺的一部分。 <{1}}方法可以替换为contents属性,而不会破坏调用方。

答案 1 :(得分:2)

没有什么特别的事情发生。与C ++相比,你会遇到以下差异:

  • 在Scala中调用不带参数的方法不需要括号 - 在这种情况下lengthlength()
  • 相同
  • 方法定义如果只包含一个表达式
  • ,则不需要包含在{}
  • 函数返回其正文中最后一个表达式的值

更像C / Java的方式是写

def height() : Int = { return contents.length(); } 

会做同样的事情,但更加冗长 - 一个很好的演示,说明为什么Scala是阅读代码的一种很棒的语言。