2017-09-19 4 views
5

실수로 예상 된 결과 유형을 예상하는 클래스에 불순한 0 값 함수를 전달한 프로덕션 버그로 인해 nipped가 발생했습니다.0-ary 함수가 Scala에서 암시 적으로 호출되지 않도록합니다.

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

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

효과적으로이 즉시 impureFunc를 호출하고 아주 미묘한 버그가 이끄는 프로그램의 수명에 대한 첫 번째 결과를 캐시 MyService했다.

일반적으로 형식 시스템은 이러한 종류의 버그를 방지하지만 인수 목록없이 0 항 함수를 호출 할 수 있기 때문에 컴파일러는이 프로그램을 수락했습니다.

분명히 이것은 스칼라의 "특징"으로, 코드를 더 깨끗하게 보이도록 설계되었지만, 이것은 나쁜 것이었다. 컴파일러 경고 또는 linting 오류를 만들 수있는 방법이 있습니까? 즉, "비어있는 응용 프로그램"유형 implicit method conversion을 비 승인 하시겠습니까?

+0

이것은 '미래'를 피하는 이유 중 하나입니다. 부작용을 일시 중단 할 수있는 더 나은 유형을 사용하고 조작 할 수 있고 순수한 값으로 구성 할 수 있습니다. 많은 옵션이 있습니다 : scalaz Task, monix Task, fs2 Task, 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을 사용하는 것입니다.