web-dev-qa-db-ja.com

scalaメソッドのUnitを使用するか、戻り値の型を省略する必要がありますか?

Unitをmy scalaメソッドの戻り値の型として指定することと、戻り値の型を完全に省略することとの違いはわかりません。違いは何ですか?

誰でもアドバイスできますか?

50
balteo

暗黙的なUnit戻り型:

_def f() {println("ABC")}
_

明示的なUnit戻り型:

_def g(): Unit = {println("ABC")}
_

最後のメソッド式から推測された型を返します。これはUnitの型であるため、依然としてprintlnですが、混乱を招きます。

_def h() = println("ABC")
_

上記のすべての方法は同等です。メソッドシグネチャだけでは_=_演算子が足りないので十分なので、f()を好みます。メソッドをさらにドキュメント化する場合は、明示的な_: Unit_を使用します。最後の形式は紛らわしく、実際には intellij-idea の警告として扱われます。

_=_演算子は重要です。存在する場合、メソッド本体に「最後のステートメントが返すものは何でも返します」を意味します。明らかに、この構文をabstractメソッドに使用することはできません。そうでない場合、Unitが想定されます。

53

プロシージャ(nitを返すメソッド)の特別な構文は誤りでした。使用しないでください。 Java/C(++)のバックグラウンドを持つ初心者にとっては混乱を招き、危険です。そして、それは不必要な特別な扱いです。型推論の有無にかかわらず、常に等号を使用します(後者はプライベートメンバーにのみ使用する必要があります)。

def foo(): Unit = someCodeReturningUnit()

private def bar() = someCodeReturningUnit()
14
Heiko Seeberger

Scalaコミュニティはそれについて分かれています。一方、明示的な戻り値の型を使用しないことは、=記号。これにより、追跡するのが面倒なエラーが頻繁に発生します。一方、異なる構文を持つUnit- returningメソッドは、それらを別のカテゴリに分類します。

個人的には、この構文は廃止したいのですが、=are追跡するのが面倒です。しかし、それは非推奨ではないので、その存在の問題に苦しむよりもむしろそれを利用したいです。

だから、あなたが望むものを使用します。どちらにせよあなたの選択を批判する人々と、それを賞賛する人々がいるでしょう。

6