2017-09-19 12 views
5

私は、まれな結果の型を誤って予想していたクラスに、不純な0値関数を渡したプロダクションバグに陥りました。0-ary関数がScalaで暗黙的に呼び出されないようにする

def impureFunc(): Future[Any] = ??? 

case class MyService(impureDependency: Future[Any] /* should have been() => Future[Any] */) 

事実上、これはすぐにimpureFuncを起動し、非常に微妙なバグにつながったプログラムの寿命のための最初の結果をキャッシュMyServiceを作りました。

通常、型システムはこの種のバグを防ぎますが、引数リストなしで0値関数を呼び出すことができるため、コンパイラはこのプログラムを受け入れます。

明らかに、これはScalaの「機能」であり、コードをよりきれいに見せるように設計されていますが、これは悪い問題でした。これをコンパイラの警告または糸くずれのエラーにする方法はありますか?言い換えれば、「空のアプリケーション」タイプimplicit method conversionを不承認としますか?

+0

これは、「未来」を避ける理由の1つです。副作用を抑えることができるより優れたタイプを使用し、純粋な値として操作して構成することができます。 scalazタスク、monixタスク、fs2タスク、cats IOなど多くのオプションがあります。 –

+0

これは役に立たないですが、dottyがこの変換を削除することに興味があります:http://dotty.epfl.ch/docs/ reference/dropped/auto-apply.htmlを参照してください。 私が知っている限り、私が使用したリンターツールのどれもこれをチェックするものはありません。 –

+0

@JoeKそれは実際には素晴らしいニュースです:) – acjay

答えて

3

ここのコメントから、この動作はdeprecated with a warning in 2.12であり、2.13ではエラーになるはずです。その答えは、アップグレード後に-deprecation -Xfatal-warningsを使用することです。

関連する問題