2

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

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

为什么height和width可以直接用contents作为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
}
4

2 回答 2

6

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

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

请注意,此功能是 Scala 对统一访问原则的承诺的一部分。该contents方法可以用contents属性替换而不会破坏调用者。

于 2012-09-17T04:39:04.460 回答
2

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

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

一种更像 C/Java 的编写方式是

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

这会做同样的事情,但会更冗长 - 很好地证明了为什么 Scala 是一种用于阅读代码的出色语言。

于 2012-09-17T04:38:41.207 回答