Scalaのパラメーターなし&空の括弧メソッド


10

現在、OderskyのプログラミングScala(2番目)を介してScalaを学習しています。私は第10章まで、パラメーターなしの空の括弧付きメソッドの導入を開始します。頭がおかしいだけです。

これまでのところ、私が理解しているのは、メソッドに副作用がある場合は空の括弧を使用し、それ以外の場合はパラメーターのないメソッドを使用する必要があることです。

この慣習の利点は何なのかわかりません。私はStack Exchangeで投稿を読みましたが、正直なところ、投稿がこのトピックについてある程度深く議論し始めたとき、私は迷いました。

この言語機能の典型的な使用例と、それをよりよく理解するのに役立つ利点について簡単な説明を探しています。

scala 

回答:


14

そもそも、慣習の必要性を防ぐために言語を設計してみませんか?言い換えると、なぜScalaは、プログラマーが括弧を省略できるようにするのではなく、括弧を常に強制的に使用しないのですか?

答えは参照透過性にあります。基本的に、関数に副作用がない場合、プログラムの動作を変更せずに、関数呼び出しをその結果に置き換えることができます。

つまり、パラメータや副作用valのない関数は、その関数の戻り値を保持することと意味的に同等です。この特性のため、クラスが進化するにつれて、プログラマーはval、利便性または効率性に応じて、aの使用と関数の使用を切り替える場合があります。

括弧を省略できるので、のようなものを呼び出すコードは、関数またはであるqueue.sizeかどうかを知る必要も、気にする必要もありません。したがって、クラスの実装者は、呼び出しコードを変更する必要なく、2つの間を自由に変更できます(ただし、再コンパイルが必要になると思います)。クラスのパブリックインターフェイスを安定させます。たとえば、潜在的なであるを呼び出すことから始めて、効率上の理由からに変更することができます。sizevalQueuequeue.sizesizeListO(n)sizeval

このクラスメンバーは間違いなく関数呼び出しであるため、参照可能に透過的ではない可能性があることを明確にするために、副作用がある場合は、この規則により括弧が提案されます。コードを呼び出す際には、副作用が発生するかどうかを知ることが重要です。副作用が繰り返し発生するのを防ぐことができます。関数であるかどうかを気にしない場合は、そうでない場合と同様に扱うことができます。


6

これは慣習であり、言語設計の一部ではありません。これは、コードを書いた後にコードを読んで理解を深める必要がある人々を助けるための標識として使用されます。

メソッド呼び出しに関するScalaのスタイルガイドから

Scalaでは、arity-0(引数なし)のメソッドで括弧を省略できます。

reply() 

// is the same as 

reply

ただし、この構文は、問題のメソッドに副作用がない(完全に機能する)場合にのみ使用してください。つまり、を呼び出すときに括弧を省略してもかまいqueue.sizeませんが、を呼び出す場合はできませんprintln()

この規則を忠実に遵守すると、コードの可読性が大幅に向上し、特定のメソッドの最も基本的な操作が一目で理解しやすくなります。単純に2文字を節約するために括弧を省略したいという衝動に抵抗してください!

.NETでは、規則は使用することです方法をコードは(50ミリ秒よりも長く、例えば)の実行に時間がかかることができたとき、およびプロパティそれはない(すなわち、それは簡単な検索である)になるとき(基本的に空括弧方法)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.