2

次のコードに最初に遭遇したとき、私は混乱しています。

クラス Element には、3 つの関数定義があります。

高さと幅が配列[文字列]の変数としてコンテンツを直接使用できるのはなぜですか?

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

この機能は、Uniform Access Principleに対する Scala のコミットメントの一部であることに注意してください。呼び出し元を壊すことなく、メソッドをプロパティにcontents置き換えることができます。contents

于 2012-09-17T04:39:04.460 に答える
2

特別なことは何も起こっていません。C++ と比較すると、次のような違いがあります。

  • Scala での引数なしのメソッドの呼び出しには、括弧は必要ありませんlength。この場合は、length()
  • {}メソッド定義に式が 1 つしか含まれていない場合、メソッド定義をラップする必要はありません。
  • 関数は、本体の最後の式の値を返します

これを書くためのよりC / Javaのような方法は次のようになります

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

これは同じことを行いますが、はるかに冗長です - Scala がコードを読むための優れた言語である理由を示す素晴らしいデモンストレーションです。

于 2012-09-17T04:38:41.207 に答える